一、概述
2015,webpack1支持CMD和AMD,同时拥有丰富的plugin和loader,webpack逐渐得到广泛应用。

2016.12,webpack2相对于webpack1最大的改进就是支持ES Module,可以直接分析ES Module之间的依赖关系,而webpack1必须将ES Module转换成CommonJS模块之后,才能使用webpack1进行下一步处理。除此之外webpack2支持tree sharking,与ES Module的设计思路高度契合。

2017.6,webpack3相对于webpack2,过渡相对平稳,但是新的特性大都围绕ES Module提出,如Scope Hoisting和Magic Comment。

二、webpack1.x升级2.x
1、支持es6模块
webpack1.x原生不支持es6模块,但是可以使用babel-loader把es6的import语法编译成commonjs和amd模块。这个方法是有效的,但是会有一个重要的动态加载警告。webpack2支持原生ES6,这意味着webpack2可以使用import和export转换为CommonJS。

import { currentPage, readPage } from "./book";
currentPage === 0;
readPage();
currentPage === 1;
// book.js
export var currentPage = 0;
export function readPage() {
  currentPage++;
}
export default "This is a book";

2、tree-shaking
众所周知,commonjs模块是动态加载的,且可以重命名,要想在静态分析阶段判断哪些代码不会被执行到,有一定难度,需要借助数据流分析。tree-shaking借助了ES6的模块机制,通过import/export等关键字来定义输入输出的方法,且其重命名只能通过as这个关键字,模块一旦被import进来,就是只读的,这样,我们只根据名字,就可以从入口文件一路溯源到模块定义处,只把用到的方法打包进来。
DCE是去除死代码,而tree-shaking是保留活代码,是实现DCE的一种方式。经过webpack2打包之后,未使用的export模块会被标记为/* unused harmony export xxx */,再经过uglify,未被export的xxx定义会被删除。

3、加载器的改变

A、module.loaders改成了module.rules

module: {
- loaders: [
+ rules: [
    {
      test: /\.css$/,
-     loaders: [
+     use: [
        {
          loader: "style-loader"
        },
        {
          loader: "css-loader",
-         query: {
+         options: {
            modules: true
          }
        }
      ]
    },
    {
      test: /\.jsx$/,
      loader: "babel-loader", // Do not use "use" here
      options: {
        // ...
      }
    }
  ]
}

B、链式调用loaders
在webpack1.x中的module.loaders使用!连接各个loader,在webpack2.x中的rules.use设置数组来配置不同loader。

module: {
- loaders: {
+ rules: {
    test: /\.less$/,
-   loader: "style-loader!css-loader!less-loader"
+   use: [
+     "style-loader",
+     "css-loader",
+     "less-loader"
+   ]
  }
}

C、json-loader不再需要手动添加
如果没有为JSON文件配置loader,webpack2将自动尝试通过加载json-loader JSON文件。

4、插件的改变

A、UglifyJsPlugin插件
UglifyJsPlugin的sourceMap配置项现在默认为false而不是true,这意味着如果你在压缩代码时启用了source map,或者想要让uglifyjs的警告能够对应到正确的代码行,你需要将UglifyJsPlugin的sourceMap设为true。
UglifyJsPlugin的compress.warnings配置项现在默认为false而不是true。这意味着如果你想要看到uglifyjs 的警告信息,你需要将compress.warnings设为true。

devtool: "source-map",
plugins: [
    new UglifyJsPlugin({
+   sourceMap: true,
+   compress: {
+     warnings: true
+   }
  })
]

B、BannerPlugin插件
BannerPlugin插件不再接受两个参数而是只接受单独的options对象。

plugins: [
-  new webpack.BannerPlugin('Banner', {raw: true, entryOnly: true});
+  new webpack.BannerPlugin({banner: 'Banner', raw: true, entryOnly: true});
]

C、OccurrenceOrderPlugin被默认加载
我们不再需要在配置里指定它。

plugins: [
-  new webpack.optimize.OccurrenceOrderPlugin()
]

D、ExtractTextPlugin插件

ExtractTextPlugin.extract

module: {
  rules: [
    {
      test: /.css$/,
-      loader: ExtractTextPlugin.extract("style-loader", "css-loader", { publicPath: "/dist" })
+      use: ExtractTextPlugin.extract({
+        fallback: "style-loader",
+        use: "css-loader",
+        publicPath: "/dist"
+      })
    }
  ]
}

new ExtractTextPlugin({options})

plugins: [
-  new ExtractTextPlugin("bundle.css", { allChunks: true, disable: false })
+  new ExtractTextPlugin({
+    filename: "bundle.css",
+    disable: false,
+    allChunks: true
+  })
]

5、webpack-dev-server1.x升级2.x

  • --inline默认开启,无需在输入命令时添加;
  • 删除contentBase用proxy代替;
  • 减少控制台无用输出,在1.x中,当我们停掉服务器后,控制台会一直输出错误信息。但是在2.x中,只会输出[WDS] Disconnected!

三、webpack2.x升级3.x
1、作用域提升
webpack2处理后的每个模块均被一个函数包裹,如下:

/***/ (function(module, __webpack_exports__, __webpack_require__) {
    window.lib = {}
    ...
/* harmony default export */ __webpack_exports__["a"] = (window.lib);

/***/ }),

这样做,会降低浏览器中JS执行效率,因为闭包函数降低了JS引擎解析速度。

于是,webpack团队参考Closure Compiler和Rollup JS,将一些有联系的模块,放到一个闭包函数里面去,通过减少闭包函数数量来加快JS的执行速度。

webpack3通过设置ModuleConcatenationPlugin使用这个新特性:

module.exports = {
  plugins: [
    new webpack.optimize.ModuleConcatenationPlugin()
  ]
};

Scope Hoisting是基于ES Module的,对于Common.js和AMD的模块不适用,不适用的情况下仍采用webpack2的模式。

2、魔法注释
在webpack2中引入了Code Splitting-Async的新方法import(),用于动态引入ES Module,webpack2将传入import方法的模块打包到一个单独的代码块(chunk),但是却不能像require.ensure一样,为生成的chunk指定chunkName,因此在webpack3中提出了Magic Comment用于解决该问题,用法如下:

import(/* webpackChunkName: "my-chunk-name" */ 'module');

webpack的版本进化史的更多相关文章

  1. HBase版本进化史及大版本特性

    HBase 2.0 新特性介绍 2018年4月30日HBase发布了2.0的Release版本.HBase的2.0版本承载了太多的Features,共包含4551个Issues,可以说是迄今最大的一个 ...

  2. webpack 中版本兼容性问题错误总结

    一定不要运行npm i  XXX  -g(-d) 一定要指定版本,尽量低版本,也不最新版本,会导致不兼容和指令不一样的问题. 1.安装webpack-dev-server 报错,说需要webpack- ...

  3. 关于webpack的版本导致的postcss-loader的问题

    来源自问题 https://segmentfault.com/q/1010000006987956 !!!发现这解决方案还是不能用,估计是webpack又更新了一轮,请看看下下方的答案 某个版本web ...

  4. 关于webpack高版本向低版本切换 如何切换?

    卸载:npm uninstall webpack -g 重新安装:npm install webpack@3.7.1 -g 直接安装指定版本就行了,如安装 2.4.1 版:cnpm install w ...

  5. webpack不同版本导致的promise不存在问题

    之前采用的axios是基于promise的,但是IE并没有内置promise,所以要提前install一个promise插件: npm install promise import Promise f ...

  6. 安装webpack最新版本出现错误

    安装完了webpack出现了以下错误 解决办法 cnpm install webpack-cli -D 安装之后,就可以正常使用webpack了

  7. webpack 4.+版本需要注意的地方

    在webpack打包的时候需要npm下载webpack-cli,而且打包JS的命令从以前的webpack .\src\main.js  .\dist\boundle.js 要编程 webpack .\ ...

  8. webpack打包vue文件报错,但是cnpm run dev正常,最后我只想说:是我太笨,还是webpack4.4版本太坑

    最近做一个项目,需要使用webpack打包 .vue 文件的单页面应用,调试都正常,使用cnpm run dev 都可以,就是webpack打包时报错.如下: ERROR in ./src/App.v ...

  9. react开启一个项目 webpack版本出错

    npx create-react-app my-app cd my-app npm start 在命令行里执行以上语句就可(前两天刚刚发现,最新版的react对webpack的版本要了新要求,大概是他 ...

随机推荐

  1. SSH开发环境搭建

    断断续续学习hibernate也有一段时间了,在这里研究一下SSH开发环境的搭建过程,自己简单的搭建一个SSH的开发环境.采用maven搭建. 0.项目结构: 1.导包:(maven项目) pom.x ...

  2. CodeForces Contest #1137: Round #545 (Div. 1)

    比赛传送门:CF #1137. 比赛记录:点我. 每次都自闭的 div1 啊,什么时候才能上 IM 呢. [A]Skyscrapers 题意简述: 有一个 \(n\times m\) 的矩阵 \(a_ ...

  3. python3之协程

    1.协程的概念 协程,又称微线程,纤程.英文名Coroutine. 线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度.在一个线程中会有很多函数,我们把这些函数称为子程序, ...

  4. 【转】Linux中常见问题(磁盘 定时任务)

    [转]Linux中常见问题(磁盘 定时任务) 第1章 linux无法上网 1)     第一步,先ping域名. ping www.baidu.com 2)再ping一个公网ip , ping 223 ...

  5. Pytorch之可视化

    先解决下keras可视化安装graphviz的问题: 注意安装顺序: sudo pip3 install graphviz # python包 sudo apt-get install graphvi ...

  6. hdfs haadmin命令

    HA集群启动后,我们可以通过一些指令来管理HDFS集群."bin/hdfs haadmin -DFSHAAdmin"指令,其可选参数: 1.-transitionToActive ...

  7. Linux内核基础设施

    1.前言 本文主要介绍Linux内核实现的基本数据类型,包括链表,内核对象,内核对象引用计数,内核对象集合, 2.链表 1. 链表的基本结构 内核链表可以将任何类型的数据结构连接起来,链表结构如下: ...

  8. FreeSWITCH与PSTN对接

    FreeSWITCH与PSTN电话系统对接设定 一.环境介绍 我们目前使用模拟的话机连接到电信运营商,购买他们配套的电话总机,勉强实现了公司的基本通话.但是客户电话总机系统以及升级添加新的应用不但费用 ...

  9. Spatial Transformer Networks

    参考:http://blog.csdn.net/xbinworld/article/details/69049680 论文的关键在理解这句话: 先通过V中坐标(xtarget,ytarget)以此找到 ...

  10. Hibrenate关系映射(一对一外键关联)

    一.一对一(单向):使用外部索引将其中的一个类作为parent,相对应的一个就是子类,并且参照父 类的主键ID来生成数据库表.(比如:可以将husband中设置一个wife_id对应wife中的主键i ...