webpack的版本进化史
一、概述
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的版本进化史的更多相关文章
- HBase版本进化史及大版本特性
HBase 2.0 新特性介绍 2018年4月30日HBase发布了2.0的Release版本.HBase的2.0版本承载了太多的Features,共包含4551个Issues,可以说是迄今最大的一个 ...
- webpack 中版本兼容性问题错误总结
一定不要运行npm i XXX -g(-d) 一定要指定版本,尽量低版本,也不最新版本,会导致不兼容和指令不一样的问题. 1.安装webpack-dev-server 报错,说需要webpack- ...
- 关于webpack的版本导致的postcss-loader的问题
来源自问题 https://segmentfault.com/q/1010000006987956 !!!发现这解决方案还是不能用,估计是webpack又更新了一轮,请看看下下方的答案 某个版本web ...
- 关于webpack高版本向低版本切换 如何切换?
卸载:npm uninstall webpack -g 重新安装:npm install webpack@3.7.1 -g 直接安装指定版本就行了,如安装 2.4.1 版:cnpm install w ...
- webpack不同版本导致的promise不存在问题
之前采用的axios是基于promise的,但是IE并没有内置promise,所以要提前install一个promise插件: npm install promise import Promise f ...
- 安装webpack最新版本出现错误
安装完了webpack出现了以下错误 解决办法 cnpm install webpack-cli -D 安装之后,就可以正常使用webpack了
- webpack 4.+版本需要注意的地方
在webpack打包的时候需要npm下载webpack-cli,而且打包JS的命令从以前的webpack .\src\main.js .\dist\boundle.js 要编程 webpack .\ ...
- webpack打包vue文件报错,但是cnpm run dev正常,最后我只想说:是我太笨,还是webpack4.4版本太坑
最近做一个项目,需要使用webpack打包 .vue 文件的单页面应用,调试都正常,使用cnpm run dev 都可以,就是webpack打包时报错.如下: ERROR in ./src/App.v ...
- react开启一个项目 webpack版本出错
npx create-react-app my-app cd my-app npm start 在命令行里执行以上语句就可(前两天刚刚发现,最新版的react对webpack的版本要了新要求,大概是他 ...
随机推荐
- ubuntu下安装intel realsense驱动
在安装之前一定要确保系统是ubuntu 14.04.3 64位! 由于一开始安装的是32位系统,导致在升级内核版本到4.4时各种问题,最终靠重装系统解决. 因为intel给出的测试代码均是在64位14 ...
- IDEA常用快捷键和常用插件集成,持续更新......
用习惯了eclipse,不容易转过来,记一下! 快捷键 psvm: main 方法快捷键 sout :syso快捷键 CTRL+O: 重写父类方法 Ctrl+Alt+V :自动补全返回值 Ctrl+S ...
- MySQL5.7更改用户名密码
更改用户名密码,官方推荐使用alter ALTER USER test@'%' IDENTIFIED BY '; 还有一种 update mysql.user set authentication_s ...
- zabbix3.0.4通过自定义shell脚本添加对关键日志文件的监控
zabbix添加对自定义无规则日志文件的监控 项目背景及思路: zabbix自带有针对日志文件的监控,自带的监控只能监控到指定文件或者正则匹配的固定日志文件,但当需要监控的文件名没有规律的时候自带监控 ...
- Python-浮动 清浮动
# 浮动布局 ## 一.display总结 ```css/* inline *//*1.同行显示, 就相当于纯文本, 当一行显示不下, 如就是一个字显示不下,那么显示不下的那一个字就会自动换行,和纯文 ...
- JavaScript 使用 mediaDevices API 选择摄像头
大多数智能手机都有前置和后置摄像头,当你在创建视频应用时你可能想要选择或者切换前置.后置摄像头. 如果你开发的是一款聊天应用,你很可能会想调用前置摄像头,但如果你开发的是一款拍照软件,那么你会更倾向于 ...
- 性能测试二十五:redis-cli 命令总结
常用命令dbsize:查看redis中的kv数量 keys *:查看redis中所有的keyset key_1 v_1:新增一个key_1,包含v_1get key_1:查看key_1中的内容del ...
- *****hibernate主键生成
一.主键主键是关系数据库中的一个基本概念,它用来保证记录的唯一性主键都是没有业务含义的,所以开发 者不会.也不需要,显示地设置实体对象的主键值.但是对于数据库来说,主键是必须的 Hibernate内置 ...
- 步步为营-58-SQLite的使用
说明:文档型关系数据库,多用于移动端 1.1 添加引用 ` 1.1.1 System.Data.SQLite.xml 1.1.2 System.Data.SQLite.dll 1.2 连接字符串的设置 ...
- Xshell不能使用退格、删除键进行删除的解决方法
xshell在输入命令时,如果敲错字母了的时候,想通过按退格键删除敲错的字母,却在屏幕显示出了“^H”,退格不行,再按删除键,却显示出“^[[3~”,怎么着就是删除不了输错的字母. 修改办法:文件-- ...