webpack打包知识点总结
1.webpack
是一个模块打包工具,能够从一个需要处理的 JavaScript
文件开始,构建一个依赖关系图(dependency graph
),该图映射到了项目中每个模块,然后将这个依赖关系图输出到一个或者多个 bundle
中。
2.关键概念:
entry
:项目入口
module
:开发中每一个文件都可以看做 module
,模块不局限于 js
,也包含 css
、图片等
chunk
:代码块,一个 chunk
可以由多个模块组成
loader
:模块转化器,模块的处理器,对模块进行转换处理
plugin
:扩展插件,插件可以处理 chunk
,也可以对最后的打包结果进行处理,可以完成 loader
完不成的任务
bundle
:最终打包完成的文件,一般就是和 chunk
一一对应的关系,bundle
就是对 chunk
进行便意压缩打包等处理后的产出
3.Loader
解析顺序是从右到左(从后到前)的
4.三大主流模块规范
CommonJS
、AMD
和 ES6 Module
①CommonJS
:node.js
、服务器、同步,使用require
来导入一个模块,module.exports
导出模块
// sayhi.js
var hi = 'hello world';
function sayHi() {
return hi;
}
module.exports = sayHi;
// index.js
var sayHi = require('./sayhi.js');
console.log(sayHi());
②AMD
:浏览器、异步,使用require()
:引入其他模块;define()
:定义新的模块
// sayhi.js
define(function() {
var hi = 'hello world';
return function sayHi() {
return hi;
};
});
// index.js
require(['./sayhi.js'], function(sayHi) {
console.log(sayHi());
});
③ES6 Module
,不仅仅在 Web 现代浏览器(例如 Chrome)上面得到实现,而且在 Node.js
9+ 版本也得到原生支持(需要加上--experimental-modules
使用)
// sayhi.js
const hi = 'hello world';
export default function sayHi() {
return hi;
}
// index.js
import sayHi from './sayhi';
console.log(sayHi());
4.Webpack生成bundle的hash值有三种:
①hash
:每次编译 Compilation
对象的 hash
,全局一致,跟单次编译有关,跟单个文件无关,不推荐使用;
②chunkhash
:chunk
的 hash
,根据不同的 chunk
及其包含的模块计算出来的 hash
,chunk
中包含的任意模块发生变化,则 chunkhash
发生变化,推荐使用;
③contenthash
:CSS 文件特有的 hash
值,是根据 CSS
文件内容计算出来的,CSS
发生变化则其值发生变化,推荐 CSS
导出中使用。
5.在 Webpack 中,总共提供了三种方式来实现代码拆分(Code Splitting):
①entry
配置:通过多个 entry 文件来实现;
②动态加载(按需加载):通过写代码时主动使用import()
或者require.ensure
来动态加载;
③抽取公共代码:使用splitChunks
配置来抽取公共代码。