接下来就要使用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. NX二次开发-UFUN设置工程图PNG图片高度UF_DRF_set_image_height

    #include <uf.h> #include <uf_drf.h> UF_initialize(); //插入PNG char* file_name = "D:\ ...

  2. 微信-小程序-开发文档-服务端-模板消息:templateMessage.addTemplate

    ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.addTemplate 1.返回顶部 1. templateMessage.addTemplate 本接口应在 ...

  3. 2019 牛客多校第五场 B generator 1

    题目链接:https://ac.nowcoder.com/acm/contest/885/B 题目大意 略. 分析 十进制矩阵快速幂. 代码如下 #include <bits/stdc++.h& ...

  4. 拾遗:{rpm、yum及源码方式管理软件包}

    一.yum配置文件位置 /etc/yum.conf /etc/yum.repos.d/*.repo 二.yum常用命令 install pkgs reinstall pkgs update pkgs ...

  5. LaTeX+TexStudio安装与使用

    (很多杂志期刊接受LaTeX电子版时会提供自己的模板,只要使用他们的模板即可完美地展现在对应的刊物中) 0x00. 优点 丰富易用的数学公式和特殊符号: 容易生成图表编号.引用.交叉引用.目录: 可以 ...

  6. 4.8 this关键字

    /** * 测试this * @author Hank * */ /* 创建一个对象分为如下四步: 1.分配对象空间,并将对象成员变量初始化为0或空 2.执行属性值的显示初始化 3.执行构造方法 4. ...

  7. c++ socket 出现绑定失败的一个特殊原因。Bind failed Error:10049

    这个问题,客户那边出现这种情况已经将近一年时间, 一直都得不到很好的解决,我提供出去的动态库可以确保没有问题,因为除了这家公司,其他有好几家公司都在用的,都是很正常的,但是这家公司很奇怪,不,应该说这 ...

  8. hive sparksession查询只显示defalt库问题

    1.spark环境记得拷贝进hive.xml 2.SparkSession.builder().enableHiveSupport()记得加上enableHiveSupport 3.window记得w ...

  9. 将sparkStreaming结果保存到Redshift数据库

    1.保存到redshift数据库的代码 package test05 import org.apache.log4j.{Level, Logger}import org.apache.spark.rd ...

  10. iOS开发系列-NSDate

    NSDate API 获取当前时间 获取时间戳 创建间隔指定时间戳的Date // 获取昨天 NSTimeInterval time = 24 * 60 * 60; NSDate *date = [N ...