instanceof Entrypoint instead 解决方案: 去除,require(‘extract-text-webpack-plugin’)的引用 ---- 问题3:webpack.optimize.CommonsChunkPlugin 目前,4.0中已经删除CommonsChunkPlugin,替换成了splitChunks,这里有相关介绍内容 解决方案: 去除 new webpack.optimize.CommonsChunkPlugin resolve('/components/index.html') }), new HashedModuleIdsPlugin(), /* //4.0 删除 CommonsChunkPlugin 模块,改为splitChunks * new webpack.optimize.CommonsChunkPlugin({ name: 'vendor' }), new webpack.optimize.CommonsChunkPlugin({ name: 'manifest', chunks
升级过程遇到的问题以及解决 问题 一 Error: webpack.optimize.CommonsChunkPlugin has been removed, please useconfig.optimization.splitChunks 解决方法: 在 webpack4 中不再支持 CommonsChunkPlugin,而是使用 splitChunks 替代,那么这两者有什么区别? 这里纸上谈兵一下 根据我查到的资料显示, CommonsChunkPlugin 存在以下的问题: CommonsChunkPlugin 会提取一些我们不需要的代码 它在异步模块上效率低下 很难使用,配置也很难理解 相比, splitChunks 具有以下特点: 它不会打包不需要的模块 对异步模块有效(默认情况下是打开的) 更加容易使用和更加自动化 我们平时配置 CommonsChunkPlugin 如下: new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', // 引入node_modules的依賴全抽出來 minChunks:
') module.exports中添加 plugins:[new VueLoaderPlugin()] 修改配置文件 webpack.prod.conf.js: webpack.optimize.CommonsChunkPlugin extract-text-webpack-plugin@next 会下载到 extract-text-webpack-plugin@4.0.0-beta Error: webpack.optimize.CommonsChunkPlugin has been removed, please use config.o ptimization… 解决: 去掉 webpack.optimize.CommonsChunkPlugin相关配置 webpackConfig removeAttributeQuotes: true }, // necessary to consistently work with multiple chunks via CommonsChunkPlugin
废弃CommonsChunkPlugin webpack4废弃了CommonsChunkPlugin,引入了optimization.splitChunks和optimization.runtimeChunk 先介绍一下code splitting下的CommonsChunkPlugin有什么缺点,然后仔介绍一下chunk split是怎么进行优化的。 CommonsChunkPlugin的问题 CommmonsChunkPlugin的思路是Create this chunk and move all modules matching minChunks CommonsChunkPlugin另外一个问题是:对异步的模块不友好。 总的来说CommonsChunkPlugin有以下三个问题: 产出的chunk在引入的时候,会包含重复的代码; 无法优化异步chunk; 高优的chunk产出需要的minchunks配置比较复杂。
webpack1,现需要升级到webpack4,特此记录下升级过程中有一些配置和需要注意的问题,具体会介绍: (1) 需要的node环境的升级 (2) mode参数切换开发模式还是生产模式 (3) 移除了CommonsChunkPlugin 在webpack4之前,可以使用webpack 内置插件:CommonsChunkPlugin。 从webpack4开始,optimization 替代了CommonsChunkPlugin插件,改用optimization属性进行更加灵活的配置。 1.2 使用optimization属性,替代CommonsChunkPlugin 每个配置项的作用: -- minSize 分离前的最小块文件大小,单位为字节 -- minChunks 分离前该块被引入的次数 需要通过配置两次new webpack.optimize.CommonsChunkPlugin来分别获取vendor和manifest的通用chunk方式已经做了整合, 直接在optimization中配置
项目的是传统的非SPA页面,我们使用了CommonsChunkPlugin来提取公共模块,保证各页面之间部分公共库可以复用缓存,同时使用UglifyJS等来保证输出文件体积的减小。 new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks: 5, }) ], } 但这么做粒度还太粗 调整CommonsChunkPlugin配置 可以发现部分可以公用的文件并没有合到vendor里来。简单调整一下配置: { // ... plugins: [ // ... new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks: 4, }) ], } 值得注意的是
项目的是传统的非SPA页面,我们使用了CommonsChunkPlugin来提取公共模块,保证各页面之间部分公共库可以复用缓存,同时使用UglifyJS等来保证输出文件体积的减小。 new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks: 5, }) ], } 但这么做粒度还太粗 调整CommonsChunkPlugin配置 可以发现部分可以公用的文件并没有合到vendor里来。简单调整一下配置: { // ... plugins: [ // ... new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks: 4, }) ], } 值得注意的是
项目的是传统的非SPA页面,我们使用了CommonsChunkPlugin来提取公共模块,保证各页面之间部分公共库可以复用缓存,同时使用UglifyJS等来保证输出文件体积的减小。 new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks: 5, }) ], } 但这么做粒度还太粗 3调整CommonsChunkPlugin配置 可以发现部分可以公用的文件并没有合到vendor里来。简单调整一下配置: { // ... plugins: [ // ... new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks: 4, }) ], } 值得注意的是
利⽤ SplitChunksPlugin 分离基础库 此插件是Wabpack4内置的,无需安装,用于替代CommonsChunkPlugin插件。 利⽤ SplitChunksPlugin 分离依赖包 此插件是Wabpack4内置的,无需安装,用于替代CommonsChunkPlugin插件。 利⽤ SplitChunksPlugin 分离⻚⾯公共⽂件 此插件是Wabpack4内置的,无需安装,用于替代CommonsChunkPlugin插件。
webpack --save-dev 我们看看下方的示例: var webpack = require('webpack'); var commonsPlugin = new webpack.optimize.CommonsChunkPlugin 自定义公共模块提取 在文章开始我们使用了 CommonsChunkPlugin 插件来提取多个页面之间的公共模块,并将该模块打包为 common.js 。 但有时候我们希望能更加个性化一些,我们可以这样配置: var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin" /admin/page2" }, output: { filename: "[name].js" }, plugins: [ new CommonsChunkPlugin ("admin-commons.js", ["ap1", "ap2"]), new CommonsChunkPlugin("commons.js", ["p1", "p2", "admin-commons.js
webpack-dev-server # Windows $ set DEBUG=true $ webpack-dev-server Common chunk(抽出公用脚本) 当多脚本具有公共块时,可以使用CommonsChunkPlugin bundle1.js"></script> <script src="bundle2.js"></script> </body> </html> // webpack.config.js var CommonsChunkPlugin = require("webpack/lib/optimize/CommonsChunkPlugin"); module.exports = { entry: { bundle1: '. ('init.js') ] } Vendor chunk 您还可以使用CommonsChunkPlugin从脚本中将供应商库提取到单独的文件中。 : ['jquery'], }, output: { filename: 'bundle.js' }, plugins: [ new webpack.optimize.CommonsChunkPlugin
的详细用法可以在这里看到——https://github.com/isaacs/node-glob */ let glob = require('glob'); /* webpack插件 */ let CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin; let UglifyJsPlugin = webpack.optimize.UglifyJsPlugin; let publicPath //如果为true,那么公共组件的所有子依赖都将被选择进来 }), //在async chunk 里面找到复用 >= 2次的模块再单独提取出来 new CommonsChunkPlugin = webpack.optimize.CommonsChunkPlugin; let UglifyJsPlugin = webpack.optimize.UglifyJsPlugin; let publicPath [ext]' } ] }, plugins: [ new CommonsChunkPlugin({ name
需要分离的文件 }; //进行模块化 module.exports=entry; 2.1.2 第二步:引入插件 引入optimize优化插件,并进行相关配置,如下: new webpack.optimize.CommonsChunkPlugin 2.2.3 修改插件配置 修改CommonsChunkPlugin配置 需要修改两个位置: 第一个是在name属性里把原来的字符串改为数组,因为我们要引入多个模块,所以是数组; 第二个是在filename 修改代码如下: new webpack.optimize.CommonsChunkPlugin({ //name对应入口文件中的名字,我们起的是jQuery name:['jquery'
process.env.NODE_ENV到不同环境,也就是不需要 DefinePlugin来做这个了 如果你给mode设置为 none,所有默认配置都去掉了 如果不加这个配置webpack会出现提醒,所以还是加上吧 CommonsChunkPlugin 相信大家如果听说过webpack4的更新,最大的感触应该就是去除了CommonsChunkPlugin,毕竟官方 change log写的篇幅最多的就是这个 CommonsChunkPlugin删除之后
构建的入口是每个页面的入口,使用CommonsChunkPlugin将项目的基础库打包到vendor中,便于做缓存,使用web-webpack-plugin组织页面文件。 vendor里包含了index和home的hash信息, 这其实是使用CommonsChunkPlugin提取公共代码时,将页面的运行时信息,放到了vendor。 new webpack.optimize.CommonsChunkPlugin({ name: ['vendor', 'runtime'], minChunks: 5,
html-minifier#options-quick-reference }, // necessary to consistently work with multiple chunks via CommonsChunkPlugin webpack.optimize.ModuleConcatenationPlugin(), // split vendor js into its own file new webpack.optimize.CommonsChunkPlugin // prevent vendor hash from being updated whenever app bundle is updated new webpack.optimize.CommonsChunkPlugin https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk new webpack.optimize.CommonsChunkPlugin
= [ createHtmlDef({path: 'demo2.html', chunks: ['vendor', 'demo2']}), new webpack.optimize.CommonsChunkPlugin CommonsChunkPlugin的工作原理相当于把指定的chunks里每个chunk引用的所有资源先抽出来,然后对这些重复资源进行统计,看每个重复资源被n个chunk引用,如果n>=minChunks 因此 new webpack.optimize.CommonsChunkPlugin({ name: "vendor", minChunks: Infinity, }) var entries
/src/main.js' } new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', minChunks 要解决这个问题,这里我们可以使用 CommonsChunkPlugin 的 async 并在 minChunnks 里的count方法来判断数量,只要是 重用次数 超过两个包括两个的异步加载模块(即 import new webpack.optimize.CommonsChunkPlugin({ async: 'used-twice', minChunks: (module, count) => ( = (module.exports.plugins || []).concat([ new BundleAnalyzerPlugin(), new webpack.optimize.CommonsChunkPlugin resource.indexOf('node_modules') >= 0 && resource.match(/\.js$/) ) }), new webpack.optimize.CommonsChunkPlugin
webpack.optimize.CommonsChunkPlugin 用途: 用于将页面里的公共代码提取出来,从而进行优化加载速度,该CommonsChunkPlugin只支持Webpack4之前。 /main.js", vendor: ["Vue"] }, plugins: [ new Webpack.optimize.CommonsChunkPlugin name: "vendor", filename: "[name].js" }), new Webpack.optimize.CommonsChunkPlugin Webpack运行时的代码也提取出来, 这样vendor就再次打包也不会变化,可以走浏览器缓存 optimization.SplitChunks 用途: 该功能与上面的webpack.optimize.CommonsChunkPlugin
uglifyjs-webpack-plugin": "^1.1.1", 以及 7 个 webpack 内置插件: HashedModuleIdsPlugin ModuleConcatenationPlugin CommonsChunkPlugin 比如下面是常常用于提取公共模块的 CommonsChunkPlugin 的配置: new webpack.optimize.CommonsChunkPlugin({ name: 'app', 然后你就去看了 CommonsChunkPlugin 的文档,十五分钟艰难的阅读之后,你会发现这四项配置都不简单,每一项的更改会给构建带来很大的影响。