接下来就要使用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. VS开发工具的常用插件【转载】

    文章转载自https://www.cnblogs.com/huntergu/p/8337266.html

  2. (转)python:Redirection is not supported

    Redirection isnot supported. 不支持重定向 解决方法: cmd: 在CMD命令行中,输入 "python" + "空格",即 &qu ...

  3. 拾遗:Linux 用户及权限管理基础

    Lacks of Knowledge 1: Linux has large amount of COMMANDS,but many of them have similar funtions,it's ...

  4. 数据库和java Bean

    ·1. 数据库和java Bean,字段类型要一致.不一致查询不出来,但不会报错. 字段名称也一样,不一致查询不出来,但不会报错. 2. 数据库和java Bean字段的个数可以不一样,也不会包错 3 ...

  5. mybatis 3 批量插入返回主键 Parameter 'id' not found

    @Insert("<script>INSERT INTO scp_activity_gift (activity_id,type,gift_id,status,limit_num ...

  6. 第六天 函数与lambda表达式、函数应用与工具

    一.函数 1.匹配 位置匹配 def func(a,b,c): print(a,b,c) func(c=1,a=2,b=3) 2 3 1 def func(a, b=2, c=3): print(a, ...

  7. LA 3263 /// 欧拉定理 oj21860

    题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...

  8. Java常用文件下载与查找的URL

    Java JDK: http://www.oracle.com/technetwork/java/javase/downloads/index.html Tomcat: http://tomcat.a ...

  9. gcc 4步编译过程

    一. gcc编译过程  1. 预处理: 主要进行宏替换以及头文件的展开  gcc  -E   *.c  -o  *.i 2.  编译::编译生成汇编文件,会检查语法错误   gcc  -S   *.i ...

  10. SpringBoot Redis 订阅发布

    一  配置application.yml spring: redis: jedis: pool: max-active: 10 min-idle: 5 max-idle: 10 max-wait: 2 ...