Webpack-CommonsChunkPlugin

当前项目结构

项目结构

其中

  • Greeter.js 引用了 config.json
  • main.js 和 second.js 都引用了 Greeter.js
  • main.js 还引用了 onlyformain.js
  • second.js 还引用了 onlyforsecond.js

代码如下

// config.json
{
  "greetText": "Hi there and greetings from JSON!"
}

// Greeter.js
var config = require('./config.json');
module.exports = function() {
  var greet = document.createElement('div');
  greet.textContent = config.greetText;
  greet.innerText = config.greetText;
  console.log(config.greetText)
  return greet;
};

// main.js
import 'babel-polyfill'
import './OnlyForMain'
var greeter = require("./Greeter.js")
document.getElementById('root').appendChild(greeter());
console.log("this is from main.js")

// second.js
import 'babel-polyfill'
import './OnlyForSecond'
var greeter = require("./Greeter.js")
document.getElementById('root').appendChild(greeter());
console.log("this is from second.js")

// onlyformain.js
var config = require('./config.json');
module.exports = function() {
  console.log("this is only for main")
  return {};
};

// onlyforsecond.js
var config = require('./config.json');
module.exports = function() {
  console.log("this is only for second")
  return {};
};

webpack 配置

Paste_Image.png

当配置 commonChunkPlugin 参数,结果如下:

Case 1

Paste_Image.png

命令行

Paste_Image.png

打包后


没有后缀

Case2

Paste_Image.png

命令行

Paste_Image.png

提出了公共js - init.js

Case3

Paste_Image.png

命令行

Paste_Image.png

Case4

Paste_Image.png

命令行

4

**assert 名称 和 chunk 名称 不一样了 **

Case5

5

命令行

Paste_Image.png

Case6

Paste_Image.png

命令行

Paste_Image.png

此时common.js中仅仅有module-require函数

Case7

Paste_Image.png

命令行

Paste_Image.png

此时common.js提取出了config.json和Greeter.js

Case8

Paste_Image.png

命令行

Paste_Image.png

common.js提取出了所有的js,此时 main.js 和 second.js中的代码仅有一行

webpackJsonp([0,1],[]);

Case9

Paste_Image.png

命令行

Paste_Image.png

**仅仅提出了 module-require 公共部分 ,其他公共模块并不抽取 **

Case 10

Paste_Image.png

命令行

Paste_Image.png

Case11

Paste_Image.png

命令行

Paste_Image.png

总结

CommonsChunkPlugin

options.name或options.names(string | string []):公共块的块名称。 可以通过传递现有块的名称来选择现有块。 如果传递一个字符串数组,这等于为每个块名称多次调用插件。 如果省略并且options.async或options.children设置为所有块,则使用options.filename作为块名。

options.filename(string):公共块的文件名模板。 可以包含与output.filename相同的占位符。 如果省略,原始文件名不会被修改(通常为output.filename或output.chunkFilename)。

options.minChunks(number | Infinity | function(module,count) - > boolean):在移动到公共块之前需要包含一个模块的块的最小数量。 该数字必须大于或等于2且小于或等于块的数量。 传递无限只是创建公共块,但不移动模块。 通过提供一个函数,你可以添加自定义逻辑。 (默认为块的数量)

options.chunks(string []):按块名称选择源块。 块必须是公共块的子节点。 如果省略,则选择所有条目块。

options.children(boolean):如果true,则选择公共块的所有子节点

options.async(boolean | string):如果为true,将创建一个新的异步公共块作为options.name的子节点和options.chunks的子节点。 它与options.chunks并行加载。 可以通过提供所需的字符串而不是true来更改输出文件的名称。

options.minSize(number):创建公共块之前所有公共模块的最小大小。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官方文档: CommonsChunkPlugin options.name or options.names (s...
    yiludege阅读 1,271评论 0 2
  • 1.demo结构: 2.package.json配置: 3.多种打包情况(未使用CommonsChunkPlugi...
    若邪Y阅读 5,014评论 6 7
  • 这个问题其实是因为webpack在每次执行的过程中都会生成一段带有模块标示的js真正被执行的时候会用到的脚本 官方...
    Jalon阅读 2,550评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,155评论 19 139
  • 今年以来,我一直坚持跑步,就算前些日子太阳烤的大地都快冒烟了,我仍然坚持着哼哧哼哧的跑完了我的里数和时间。每天...
    天天月月阅读 347评论 0 0