webpack 简单笔记(二)CommonsChunkPlugin插件
接下来就要使用CommonsChunkPlugin插件
(一)单一入口,模块单一引用,分文件输出,单一入口,模块重复引用,分文件输
main.js代码
require('./static/js/main1.js')
require('./static/js/main2.js')
console.log('I`m main.js');
webpack.config.js代码
'use strict'
const path = require('path');
const webpack = require('webpack') module.exports = {
entry:{
main:'./main.js'
},
output:{
path: path.resolve(__dirname, './dist'),
filename:'bundle.js'
},
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name:'app', // ( 公共chunk(commnons chunk) 的名称)
filename: "app.js", // ( 公共chunk 的文件名)
})
]
}
输出文件main.js main.js,main1.js,main2.js,都被打包到main.js里
webpackJsonp([],[
/* 0 */
/***/ (function(module, exports) { var chunk2=;
exports.chunk2=chunk2;
console.log('chunk2') /***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) { __webpack_require__()
__webpack_require__()
console.log('I`m main.js'); /***/ }),
/* 2 */
/***/ (function(module, exports, __webpack_require__) { __webpack_require__();
var chunk1=;
exports.chunk1=chunk1;
console.log('chunk1') /***/ })
],[]);
单一入口,模块单一引用,分文件输出和单一入口,模块重复引用,分文件输是一样的
main2.js模块被引用了两次.打包后,所有模块还是被打包到main.js中
(二)多入口,模块重复引用,分文件输出(将多次引用的模块打包到公共模块)
webpack.config.js
'use strict'
const path = require('path');
const webpack = require('webpack') module.exports = {
entry:{
main:'./main.js',
maindemo:'./maindemo.js'
},
output:{
path: path.resolve(__dirname, './dist'),
filename:'[name].js'
},
plugins:[
new webpack.optimize.CommonsChunkPlugin({
name:'app', // ( 公共chunk(commnons chunk) 的名称)
//filename: "app.js", // ( 公共chunk 的文件名)
minChunks:
})
]
}
打包完我们可以看到
app.js中代码
(function(module, exports) { var chunk2=;
exports.chunk2=chunk2;
console.log('chunk2') /***/ }),
/* 1 */
/***/ (function(module, exports, __webpack_require__) { __webpack_require__();
var chunk1=;
exports.chunk1=chunk1;
console.log('chunk1')
这里把main1.js和main2.js打包到app.js。
这些是基础的使用。接下来看一下项目中的使用
(三)项目中分vendor,manifest,app打包
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks (module,count) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) ===
)
}
})
//提取公共代码
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
//应当在生成入口 chunk 时,尽量减少入口 chunk 的体积,以提高性能。下述代码块将
//只提取包含 runtime 的 chunk ,其他 chunk 都作为子模块:
minChunks: Infinity
}),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
// 如果设置为 `true`,一个异步的 公共chunk 会作为 `options.name` 的子模块,和 `options.chunks` 的兄弟模块被创建。
// 它会与 `options.chunks` 并行被加载。
async: 'vendor-async',
children: true,// 如果设置为 `true`,所有 公共chunk 的子模块都会被选择
minChunks:
}),
1.其中的 vendor 的chunk 是打包公共组件的代码,分离公共js到vendor中,
声明公共的模块来自node_modules文件夹
minChunks: number|Infinity|function(module, count) -> boolean,
// 在传入 公共chunk(commons chunk) 之前所需要包含的最少数量的 chunks 。
// 数量必须大于等于2,或者少于等于 chunks的数量
// 传入 `Infinity` 会马上生成 公共chunk,但里面没有模块。
// 你可以传入一个 `function` ,以添加定制的逻辑(默认是 chunk 的数量)
注:结合长期缓存,你可能需要使用这个插件去避免 公共chunk 改变。 你也需要使用 records
去保持稳定的模块 id,例如,使用 NamedModulesPlugin
或 HashedModuleIdsPlugin
。
2. 上面虽然已经分离了第三方库,每次修改编译都会改变vendor的hash值,导致浏览器缓存失效。原因是vendor包含了webpack在打包过程中会产生一些运行时代码,运行时代码中实际上保存了打包后的文件名。
当修改业务代码时,业务代码的js文件的hash值必然会改变。一旦改变必然会导致vendor变化。vendor变化会导致其hash值变化。
maifest下面主要是将运行时代码提取到单独的manifest文件中,防止其影响vendor.js
注:CommonsChunkPlugin
可以用于将模块分离到单独的文件中。然而 CommonsChunkPlugin
有一个较少有人知道的功能是,能够在每次修改后的构建结果中,将 webpack 的样板(boilerplate)和 manifest 提取出来。通过指定 entry
配置中未用到的名称,此插件会自动将我们需要的内容提取到单独的包中:
注意,引入顺序在这里很重要。CommonsChunkPlugin
的 'vendor'
实例,必须在 'manifest'
实例之前引入。
minChunks
设置为Infinity
这个配置保证没其它的模块会打包进 公共chunk
3.当设置async的意思是:用新的异步加载的额外公共chunk。当下载额外的 chunk 时,它将自动并行下载。
webpack 简单笔记(二)CommonsChunkPlugin插件的更多相关文章
- webpack 简单笔记(一)
安装部分不介绍了 (一)第一个最简单的demo,单入口,单文件 目录结构: webapck.config.js中代码: 'use strict' const path = require('path' ...
- webpack 简单笔记(三)vue-cli 使用 webpack-bundle-analyzer 分析
当我们使用CommonsChunkPlugin插件时可以使用webpack-bundle-analyzer插件来分析分块是否达到我们的目地 安装 npm install --save-dev webp ...
- webpack简单笔记
本文简单记录学习webpack3.0的笔记,已备日后查阅.节省查阅文档时间 安装 可以使用npm安装 //全局安装 npm install -g webpack //安装到项目目录 npm insta ...
- webpack学习笔记 (二) html-webpack-plugin使用
这个插件的两个作用: 为html文件中引入的外部资源如script.link动态添加每次compile后的hash,防止引用缓存的外部文件问题 可以生成创建html入口文件,比如单页面可以生成一个ht ...
- webpack学习笔记 (三) webpack-dev-server插件和HotModuleReplacementPlugin插件使用
webpack-dev-server插件 webpack-dev-server是webpack官方提供的一个小型Express服务器.使用它可以为webpack打包生成的资源文件提供web服务. we ...
- webpack学习笔记二
sourceMap 源代码与打包后的代码的映射关系.例如,在某个源文件中test.js里面有个错误,如果开启状态,那么打包后运行的报错信息就会说明是错误的具体位置,如果是关闭状态,报错后,提示的报错位 ...
- Dynamic CRM 2013学习笔记(二)插件基本用法及调试
插件是可与 Microsoft Dynamics CRM 2013 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标准行为.也可 ...
- webpack笔记二 管理资源
webpack笔记二 管理资源 webpack最出色的功能之一就是除了引入JavaScript,还可以通过loader引入任何其它类型的文件. 加载CSS 为了在JavaScript模块中import ...
- Html学习笔记(二) 简单标签
标签的重点 标签的用途 标签在浏览器中的默认样式 <body>标签: 在网页上显示的内容 <p>标签: 添加段落 <hx>标签: 添加标题 标签一共有6个,h1.h ...
随机推荐
- PHP ftp_rename() 函数
定义和用法 ftp_rename() 函数重命名 FTP 服务器上的文件或目录. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_rename(ftp_connectio ...
- HBase的应用场景及特点
一.Hbase能做什么?1. 海量数据存储:上百亿行 x 上百万列并没有列的限制当表非常大的时候才能发挥这个作用, 最多百万行的话,没有必要放入hbase中2. 准实时查询:百亿行 x 百万列,在百毫 ...
- kafka的简单命令
启动kafka自带的zookeeper ./bin/zookeeper-server-start.sh config/zookeeper.properties & 启动kafka ./bin/ ...
- hdu多校第十场 1009 (hdu6699) Block Breaker bfs/模拟
题意: 紧密排列的方块因为摩擦力一个一个稳定地挤在一起,但当一个方块的四个邻居中,上下两个至少空缺一个,左右两个至少空缺一个,则这个方块也将掉落. 每次锤掉一个方块,求多少个方块受牵连落下. 题解: ...
- Matlab求三重积分
Matlab求三重积分 求 \(\int_0^1 \int_0^1 \int_0^1 sin(\pi x_1 x_2 x_3) dx_1 dx_2 dx_3\) 代码是: triplequad(@(x ...
- python 16 文件操作(二)
转自 http://www.cnblogs.com/BeginMan/p/3169020.html 一.文件系统 从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进 ...
- LA2218 Triathlon /// 半平面交 oj22648
题目大意: 铁人三项分连续三段:游泳 自行车 赛跑 已知各选手在每个单项中的速度v[i],u[i],w[i] 设计每个单项的长度 可以让某个特定的选手获胜 判断哪些选手有可能获得冠军 输出n行 有可能 ...
- idea中项目发布到svn服务器
1. 在svn上创建仓库 https://5VY9MN7OCQV7B9N/svn/KH75-myhouse 2. 将idea的项目上传至svn服务器 项目变红 上传完成项目变成绿色 查看svn服务有文 ...
- winsock 服务器代码(不建议win服务器listen防火墙会禁止外部访问的)
int SessionBase::ServerSock() { /* 4 * WSADATA是个结构体,在WSAStartup中被填充. 5 * WSAStartup为调用WinSock准备初始化的工 ...
- 【noi.ac-CSP-S全国模拟赛第三场】#705. mmt
给定数组a[],b[] 求$$c_i=\sum_{j=1}^{i} a_{\left \lfloor \frac{n}{j} \right \rfloor}·b_{i \bmod j}$$ 大概就是对 ...