一、概述
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. libevent 和 libev 提高网络应用性能

    构建现代的服务器应用程序需要以某种方法同时接收数百.数千甚至数万个事件,无论它们是内部请求还是网络连接,都要有效地处理它们的操作.有许多解决方 案,但是 libevent 库和 libev 库能够大大 ...

  2. Python3学习笔记11-循环语句

    条件判断使用if,需要加上冒号,当条件判断为True时,执行if下的代码块,为false就什么也不做 只要var1不是0,非空字符串,非空list等,就判断为True.否则为False var1 = ...

  3. zabbix实现对tomcat的监控

    zabbix实现对tomcat的监控 工作原理 比如:当Zabbix-Server需要知道java应用程序的某项性能的时候,会启动自身的一个Zabbix-JavaPollers进程去连接Zabbix- ...

  4. centos6.5报错:checking filesystems failed问题处理

    centos系统重启报错:checking filesystems failed checking filesystems /dev/mapper/vg_0-root: 搜了下可能是文件系统损坏 根据 ...

  5. Springboot分模块开发详解(1):建立父工程

    基础服务,见下: base是父工程,base-entity是实体层,base-dao是DAO层,base-service是业务层,base-controller是WEB控制器层,base-web是页面 ...

  6. Android:ZoomControls控件

    ZoomControls控件 //_ZoomControls.java public class _ZoomControls extends Activity{ @Override protected ...

  7. Expm 2_2 查找中项问题

    对于长度为n的整型数组A,随机生成其数组元素值,然后实现一个线性时间的算法,在该数组中查找其中项. package org.xiu68.exp.exp3; import java.util.Array ...

  8. Spring_使用XML文件的方式配置事务

    步骤: 正常配置jdbctemplate 正常配置bean 配置事物管理器 配置事物管理器 配置aop切入点,通过切入点把事物链接起来 思路: 接着上一个买书的例子吧,直接拷到新包下,把注解都干掉,需 ...

  9. java多线程快速入门(六)

    多线程应用实例(批量发送短信) 1.创建实体类 package com.cppdy; public class UserEntity { private int id; private String ...

  10. linux之常见命令

    linux之常见命令 创建一个目录 /data mkdir /data ls -l /data/ cd /data/ pwd 相对路径与绝对路径 1.绝对路径 从根开始的路径 /data 2.相对路径 ...