请注意,这是一篇站在完全新手的角度上来写的文章。可能你是一个后端人员想了解前端工具的使用和概念;也可能你是一个前端小菜(还在DIV+CSS的世界里挣扎着)。本文比较适合那些以前完全没有接触过WebPack,而又想使用的朋友。通过本文你能理解webPack工作原理及做用!(不会至于看了半天资料还没有头绪!)

前言:本人是一个从后端转向前端的程序猿,在此之前对于前端的印象一直是:HTML + CSS + JS。完全没有想过前端会发展的如此的迅速,各种名词的出现:Node、NPM、Grunt、Gulp、Bower、Webpack、Browserify、Yeoman。瞬间让感觉到不知道如何下手(好像根本学不完的样子)!

先上一张别人的图,目前的前端工具!

一、背景

如果你和我一样,之前对于前端打包工具的发展一无所知,甚至于不知道这些工具出现的必要性。你可以浏览此部分的内容,如果你不想知道这些或者对这些并不感兴趣,可以直接跳过此部分。

互联网程序现状

随着移动互联的来袭,当前越来越多的网站已经从单纯的网页模式,开始升级为webapp模式。它们运行在现代的浏览器中,使用HTML5、CSS3、ES6等技术开发,已经从单一的浏览功能转变为一个基于浏览器的富客户端。并且webapp通常是一个SPA(Single Page Application 单页面应用)。每个页面(View)通过异步的方式加载,有着良好的用户体验。但是这样做的结果是导致程序初始化和使用的过程中需要更多、更复杂的JavaScript代码来实现,这就对前端程序的开发带来巨大的挑战!

模块化系统的演变

随着程序的复杂性的增加,项目结构的庞大。把单一js文件按职责进行模块化划分。

我们在写页面的时候会这样写:

<script src="base.js"></script>
<script src="utils.js"></script>
<script src="vipPush.js"></script>

这是最基础的JavaScript加载方式,每个JS的所有方法和属性都是暴露在window对象中的(就像把所有代码都放在一个命名空间或者同一个包下),借助全局对象,我们就能使用这些属性和方法。如果更为复杂的程序会使用命名空间的概念来组织这些模块的接口,比如:YUI

这种开发方式带来的弊端:

  • 全局的作用域下容易造成变量的相互冲突(这是一个很常见的问题)
  • 文件只能按照<script>的书写顺序进行加载
  • 开发者要解决各个模块和代码库之间的依赖
  • 如果按照此模式进行开发,长期下去整个项目(前端)代码必定会混乱不堪

因为有了模块的概念,让我们的开发变得比较方便。让我们可以很方便的使用别人的代码,想要什么功能就加载什么模块。这样下去模块的规范就变的更重要。目前:通用的JavaScript模块主要有:

  1. CommonJs
  2. AMDCMD
  3. ES6的模块

CommonJS: 同步加载解决方案

著名的node.js模块系统就是参照CommonJS规范来实现的。其核心思想就是通过require来进行同步加载其它模块,然后通过exportsmodule.exports来导出需要暴露的接口。

require("module");
require("./file.js");
exports.doStuff = function() {};
module.exports = someValue;

优点:

  1. 服务器端模块便于重用
  2. 在NPM里有很多功能模块
  3. 简单易用

缺点:

  1. 同步加载的方式注定不能用于客户端(clients),同步的加载意味着阻塞加载,浏览器的加载方式是异步的
  2. 不能非阻塞的并行加载多个模块

代表:

  1. 服务端 node.js
  2. Browserify,浏览器端的 CommonJS 实现,可以使用 NPM 的模块,但是编译打包后的文件体积可能很大

AMD: 异步加载解决方案

AMD(asynchronous Module Definition)意思就是"异步模块定义",其规范主要是一个接口define(id?, dependencies?, factory),它采用的是异步加载的方式加载模块,模块的加载不影响它后面请语句的运行。所有执行语句都是在模块加载完成之后的回调函数中执行的。

define("module", ["dep1", "dep2"], function(d1, d2) {
return someExportedValue;
});
require(["module", "../file"], function(module, file) { /* ... */ });

优点:

  1. 适合在浏览器环境中进行加载模块
  2. 可以并行多个模块

缺点:

  1. 提高了并发的成功,代码的阅读和书写比较困难
  2. 不符合通用模块化的思维方式,是一种妥协的实现

实现:

CMD: 另一种异步加载解决方案

CMD(Common Module Definition)规范与AMD很相似,尽量保持简单,并与CommonJs和Node.js的Module规范保持了很大的兼容性

define(function(require, exports, module) {
var $ = require('jquery');
var Spinning = require('./spinning');
exports.doSomething = ...
module.exports = ...
})

优点:

  1. 依赖就近,延迟执行
  2. 可以很容易在 Node.js 中运行

缺点:

  1. 依赖 SPM 打包,模块的加载逻辑偏重

实现:

ES6 模块

在ECMAScript2015(es6)中,增加了JavaScript语言层面上的模块体系定义,其设计思想是:尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出变量。

import "jquery";
export function doStuff() {}
module "localModule" {}

优点:

  1. 容易进行静态分析
  2. 面向未来的 EcmaScript 标准

缺点:

  1. 原生浏览器端还没有实现该标准
  2. 全新的命令字,新版的 Node.js才支持

实现:

把程序所有的文件进行模块化之后,我们还要处理一个问题那就是传输问题。模块的化分让我们可以让程序变得可以组件化进行开发,组件虽然被客户端执行,但是依然要由服务器传送给客户端。

关于组件的传送有两个极端:

  1. 每个组件,一个HTTP请求

    • 优点:仅仅传送依赖项
    • 缺点:请求多,负载高,更慢的启动延迟
  2. 所有的组件,一个HTTP请求

    • 优点: 更快,更低的延迟
    • 传送了没有必要传送的东西

让我在这两种情况之间做一个妥协:分块传输,按需进行懒加载,在实际用某些模块的时候进行增量的更新,才是比较合理的加载方案。

要实现这个功能,需要在编译打包时进行静态的分析、模块进行分批次的打包。那么这个分批次谁来做呢?

答案就是:WebPack

参考资料:

前端工具之WebPack解密之背景的更多相关文章

  1. 前端工具之WebPack解密--使用

    接上一篇的内容继续来说,背景篇的内容主要是介绍web前端工具的出现的原因和当前主要JavaScript模块化编程的几种规范!这篇内容主要介绍webpack的初级使用! 注意:目前webpack分为两个 ...

  2. 我的前端工具集(七)div背景网格

    我的前端工具集(七)div背景网格   liuyuhang原创,未经允许禁止转载 目录 我的前端工具集 有时候总觉得div颜色过于白,于是给了10%的灰 但是并不一定能解决问题,因为页面中会有不均衡的 ...

  3. [转帖]前端 crypto-js aes 加解密

    前端 crypto-js aes 加解密 2018.04.13 11:37:21字数 891阅读 59767 https://www.jianshu.com/p/a47477e8126a 原来前端也有 ...

  4. css3前端工具

    随着CSS3的出现,CSS3讨论的话题越来越多了,现在各种教程也是多如牛毛,不比一年前的时候,找个资料要捞遍整个互联网,而且还很难找到自己需要的参考资料.从侧面也说明,CSS3对于前端工程师来说,越来 ...

  5. VS2015前端工具:NPM和Web Essentials

    VS2015前端工具:NPM和Web Essentials 1.写作背景 想在5月份前换个工作环境了,“检讨”一下自己混饭的技术水平和处世的人脉关系,觉得很不给力!为人方面,人各有志也就不纠结了,但本 ...

  6. 【tool】部署前端工具

    一.部署前端工具如下: nodejsnpmwebpackvue 二.安装nodejs 1. 下载稳当版本nodejs 2. 配置环境变量 NODE_HOME=D:\soft\nodejs\ path= ...

  7. 构建工具:webpack与grunt/gulp

    1.    webpack 官网:http://webpack.github.io/docs/ 中文文档:http://www.css88.com/doc/webpack2/ Webpack 是一个模 ...

  8. 前端工具gulp

    最近在写一个新的项目,用到了新框架,主要是:react+webpack.里面还用到了一个前端工具——gulp. gulp在项目里的作用是打包静态资源.编译less,压缩css等.js并不在处理之列(不 ...

  9. 前端工具之-- Sublime

    开始学习前端知识,做一些笔记来记录下- 之前学习都是使用的dw 现在前端开发工具既轻便功能也够强大. 下面记录下常用的前端工具: Sublime3:需要安装第三方包,一般 Atom:继承度非常好 VS ...

随机推荐

  1. asp.net将数据导出到excel

    本次应用datatable导出,若用gridview(假设gridview设为了分页显示)会出现只导出当前页的情况. protected void btnPrn_Click(object sender ...

  2. django笔记1

    最近在博客园看来越来越多的关于python的文章,我看到时感觉特别的好,因为我也是一个特别喜欢python这门语言,喜欢python的简洁.干净,简洁而不失强大. 最近在学习django的Model模 ...

  3. iscc2016-好长的字符串

    Vm0wd2QyVkhVWGhVYmxKV1YwZDRXRmxVUm5kVlJscHpXa2M1VjFKdGVGWlZNbmhQWVd4YWMxZHViRmROYWxaeVdWZDRZV014WkhG ...

  4. iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)       1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加 ...

  5. test知识

    内部测试SIT ——system integration testcase 用户测试UAT——user acceptance test SIT是集成测试UAT是验收测试从时间上看,UAT要在SIT后面 ...

  6. ExtJS 4 类系统

    ExtJS 4的类系统(class system)进行了一次重大重构,ExtJS4的新架构就是基于这套新的类系统构建的,因此有必要先了解以下这个class system这篇文章分为四章 I: &quo ...

  7. VmWare问题解决(网络变更后虚拟主机无法上网)

    安装 Vmware,并新建一个虚拟机后,当时做好配置(NAT模式)后,虚拟机能够正常上网. 然后将电脑带到另一个地理位置办公时,却无法上网. 本篇探讨问题的缘由和几种解决方式. 一.缘由解析 仅探讨上 ...

  8. Whitespace character

    In computer science, whitespace is any character or series of whitespace characters that represent h ...

  9. BZOJ 1069 最大土地面积

    Description 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. Input 第1行一个正整数N,接下来N行,每行2个数x,y ...

  10. [Codeforces Round#286] A.Mr. Kitayuta, the Treasure Hunter 【Normal DP..】

    题目链接:CF#286 - A 这场CF就这样爆零了...我真是太蒟蒻了... 题目分析 比赛的时候看到A题就发现不会,之后一直也没想出来,于是就弃了,还好不提交也不掉Rating... 比赛后看评论 ...