接下来就要使用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插件的更多相关文章

  1. webpack 简单笔记(一)

    安装部分不介绍了 (一)第一个最简单的demo,单入口,单文件 目录结构: webapck.config.js中代码: 'use strict' const path = require('path' ...

  2. webpack 简单笔记(三)vue-cli 使用 webpack-bundle-analyzer 分析

    当我们使用CommonsChunkPlugin插件时可以使用webpack-bundle-analyzer插件来分析分块是否达到我们的目地 安装 npm install --save-dev webp ...

  3. webpack简单笔记

    本文简单记录学习webpack3.0的笔记,已备日后查阅.节省查阅文档时间 安装 可以使用npm安装 //全局安装 npm install -g webpack //安装到项目目录 npm insta ...

  4. webpack学习笔记 (二) html-webpack-plugin使用

    这个插件的两个作用: 为html文件中引入的外部资源如script.link动态添加每次compile后的hash,防止引用缓存的外部文件问题 可以生成创建html入口文件,比如单页面可以生成一个ht ...

  5. webpack学习笔记 (三) webpack-dev-server插件和HotModuleReplacementPlugin插件使用

    webpack-dev-server插件 webpack-dev-server是webpack官方提供的一个小型Express服务器.使用它可以为webpack打包生成的资源文件提供web服务. we ...

  6. webpack学习笔记二

    sourceMap 源代码与打包后的代码的映射关系.例如,在某个源文件中test.js里面有个错误,如果开启状态,那么打包后运行的报错信息就会说明是错误的具体位置,如果是关闭状态,报错后,提示的报错位 ...

  7. Dynamic CRM 2013学习笔记(二)插件基本用法及调试

      插件是可与 Microsoft Dynamics CRM 2013 和 Microsoft Dynamics CRM Online 集成的自定义业务逻辑(代码),用于修改或增加平台的标准行为.也可 ...

  8. webpack笔记二 管理资源

    webpack笔记二 管理资源 webpack最出色的功能之一就是除了引入JavaScript,还可以通过loader引入任何其它类型的文件. 加载CSS 为了在JavaScript模块中import ...

  9. Html学习笔记(二) 简单标签

    标签的重点 标签的用途 标签在浏览器中的默认样式 <body>标签: 在网页上显示的内容 <p>标签: 添加段落 <hx>标签: 添加标题 标签一共有6个,h1.h ...

随机推荐

  1. PHP ftp_rename() 函数

    定义和用法 ftp_rename() 函数重命名 FTP 服务器上的文件或目录. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_rename(ftp_connectio ...

  2. HBase的应用场景及特点

    一.Hbase能做什么?1. 海量数据存储:上百亿行 x 上百万列并没有列的限制当表非常大的时候才能发挥这个作用, 最多百万行的话,没有必要放入hbase中2. 准实时查询:百亿行 x 百万列,在百毫 ...

  3. kafka的简单命令

    启动kafka自带的zookeeper ./bin/zookeeper-server-start.sh config/zookeeper.properties & 启动kafka ./bin/ ...

  4. hdu多校第十场 1009 (hdu6699) Block Breaker bfs/模拟

    题意: 紧密排列的方块因为摩擦力一个一个稳定地挤在一起,但当一个方块的四个邻居中,上下两个至少空缺一个,左右两个至少空缺一个,则这个方块也将掉落. 每次锤掉一个方块,求多少个方块受牵连落下. 题解: ...

  5. 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 ...

  6. python 16 文件操作(二)

    转自 http://www.cnblogs.com/BeginMan/p/3169020.html 一.文件系统 从系统角度来看,文件系统是对文件存储器空间进行组织和分配,负责文件存储并对存入的文件进 ...

  7. LA2218 Triathlon /// 半平面交 oj22648

    题目大意: 铁人三项分连续三段:游泳 自行车 赛跑 已知各选手在每个单项中的速度v[i],u[i],w[i] 设计每个单项的长度 可以让某个特定的选手获胜 判断哪些选手有可能获得冠军 输出n行 有可能 ...

  8. idea中项目发布到svn服务器

    1. 在svn上创建仓库 https://5VY9MN7OCQV7B9N/svn/KH75-myhouse 2. 将idea的项目上传至svn服务器 项目变红 上传完成项目变成绿色 查看svn服务有文 ...

  9. winsock 服务器代码(不建议win服务器listen防火墙会禁止外部访问的)

    int SessionBase::ServerSock() { /* 4 * WSADATA是个结构体,在WSAStartup中被填充. 5 * WSAStartup为调用WinSock准备初始化的工 ...

  10. 【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}$$ 大概就是对 ...