什么webpack
webpack
是一个模块打包器。webpack
把模块连同它的依赖一起打包生成包含这些模块的静态资源。
安装
在使用webpack
时,建议不要把webpack
安装到全局,如果多个项目同时使用webpack
的时,很有可能会导致因为版本的不同会导致冲突。
这里主要说的的webpack 3.0+
版本。
安装方法
npm install webpack webpack-cli --save-dev
webpack 核心概念
- Entry:入口,在
webpack
执行构建的第一步将从Entry
开始,可抽象输入。
- Module:模块,在
webpack
里一切皆是模块,一个模块对应一个文件,webpack
会从配置的Entry
开始递归找出所有依赖的模块。
- Chunk:代码块,一个
Chunk
由多个模块组合而成,用于代码合并与分割。
- Loader:模块转换器,用于将模块的原内容按照需求转换成新内容。
- Plugin:扩展插件,在
webpack
构建流程中的特定时间注入扩展逻辑,来改变构建结果或做我们想要做的事情。
- Output:输出结果,在
webpack
结果一系列处理并得出最终想要的代码后输出结果。
配置
context
webpack
在寻找相对路径的文件时会以context
为根目录,context
执行启动webpack
时默认为所在的当前工作目录。
context
必须是绝对路径。
const path = require(‘path‘);
module.exports = {
context: __dirname
}
Entry
entry
是配置模块的入口,webpack
执行构建的第一步从entry
开始。
entry
类型可以是以下三种中的一种或者互相组合。
const path = require(‘path‘);
module.exports = {
// 第一种
// 入口模块的文件路径,可以是相对路径
entry:"./main.js",
// 第二种
// 入口模块的文件路径,可以使相对路径
entry:[‘./app/entry1‘,‘./app/entry2‘]
// 第三种
// 配置多个入口,每个入口生成一个chunk
entry:{
a:‘./app/entry-a‘,
b:[‘./app/entry-b1‘,‘./app/entry-b2‘]
}
}
如果是array
类型,则搭配output.library
配置项使用时,只有数组里的最后一个入口文件的模块会被导出。
# chunk
webpack
会为每个生成的chunk
取一个名称,chunk
的名称和entry
的配置有关。
- 如果
entry
是一个String
或Array
,就只会生成一个Array
,就只会生成一个Chunk
,这时Chunk
的名称是main
。
- 如果
Entry
是一个object
,就可以能会出现多个Chunk
,这时Chunk
的名称是Object
键值对中键的名称
Chunk包含信息如下
变量名 含义
id chunk的唯一标识,从0开始
name chunk名称
hash chunk的唯一标识的hash值
chunkhash chunk内容的hash值
# 配置动态Entry
如果一个项目里面需要配置多个页面,然而又需要为这些页面分别配置一个entry
入口,但是这些页面的数量可能会不断的增长,这时entry
的配置会受到其他因素的影响,导致不能写成静态的值。
const path = require(‘path‘);
module.exports = {
// 同步函数
entry:() => {
return {
a:‘./pages/a‘,
b:‘./pages/b‘
}
},
// 异步函数
entry:() => {
return new Promise((resolve) => {
resolve({
a:‘./pages/a‘,
b:‘./pages/b‘
})
})
}
}
output
output
配置如何输出最终想要的代码。output
是一个object
,里面包含一系列的配置项。
# filename
output.filename
配置输出文件的名称,为string
类型。如果只输出一个文件,则可以将它写成静态不变的。
但是有多个Chunk
要输出时,就需要借助模板和变量,webpack
会为每个Chunk
取一个name
,所以我们可以根据Chunk
的名称来区分输出的文件名。
const path = require(‘path‘);
module.exports = {
output:{
// 单个文件
filename:"index.js",
// 多个文件
filename:"[name]_[hash:8].js",
// 根据文件内容的hash值生成文件名,用来浏览器长期缓存文件
filename:"[chunkhash].js"
}
}
hash
和chunkhash
的长度是可指定的,[hash:8]
代表取8位hash
值作为文件名称。
name
代表Chunk
内置的name
去替换掉[name]
,每个要输出的Chunk
都会通过这个函数去拼接输出的文件名称。
# chunkFilename
output.chunkFilename
是用来配置当无入口文件时输出的文件名称。chunkFilename
只用于指定在运行过程中生成的Chunk
在输出时的文件名称。
const path = require(‘path‘);
module.exports = {
output:{
// 附加chunk的文件名称
chunkFilename:"[id].js",
chunkFilename:"[chunkhash].js"
}
}
# path
output.path
配置输出文件存放在本地的目录,必须是String
类型的绝对路径。通常通过Node
的path
模块去获取绝对路径。
const path = require(‘path‘);
module.exports = {
output:{
path:path.resolve(__dirname,"./dist")
}
}
注意:第二个参数为最终输出到的文件名,如果文件名不存在,则会自行创建一个同名的文件夹,并把导出的文件放到该文件夹里面。
# publicPath
output.publicPath
配置发布到线上资源需的URL
前缀,为string
类型。默认值是空字符串。
const path = require(‘path‘);
module.exports = {
output:{
// 放到CDN上
publicPath:‘https://cdn.example.com‘,
// 放到指定目录下
publicPath:"/assets/",
// 放到根目录下
publicPath:""
}
}
output.path
和output.publicPath
都支持字符串模板,内置变量只有hash
一个,代表一次编译操作的hash
的值。
# crossOriginLoading
output.crossOriginLoading
用于配置异步插入的标签的crossorigin
值。
script
标签的crossorigin
的属性可以取以下值:
anonymous
(默认),在加载此脚本资源时不会带上用户的COOKIEs
。
use-credentials
,在加载此脚本资源时会带上用户的COOKIEs
。
const path = require(‘path‘);
module.exports = {
output:{
// 异步加载资源使用方式
// 1.带有COOKIEs
crossOriginLoading:"anonymous",
// 2.不带COOKIEs
crossOriginLoading:"use-credentials"
}
}
# libraryTarget和library
使用webpack
去构建一个可以被其他模块导入的库时需要使用到libraryTarget
和library
。
output.libraryTarget
配置以何种方式导出库。
output.library
配置导出库的名称。
他们通常搭配在一起使用。
output.libraryTarget
是字符串的枚举类型。
可选值有:
- umd
- umd2
- commonjs2
- common
- amd
- this
- var
- assign
- window
- global
- jsonp
const path = require(‘path‘);
module.exports = {
output:{
// 导出库名称,为String类型
// 不填写时,默认的输出格式是匿名的立即执行函数
library:"myLibrary",
// 导出库的类型,为枚举类型,默认为var
libraryTarget:"umd"
}
}
# libraryExport
output.libraryExport
配置要导出的模块中那些子模块需要被导出。只有output.libraryTarget
被设置成commonjs
或者commonjs2
的时候才有效。
const path = require(‘path‘);
module.exports = {
output:{
libraryExport:[‘a‘,‘b‘]
}
}
lib_code
是指导出库的代码内容,是有返回值的一个自执行函数。
整体配置
在进行配置的时候并不是所有的参数都要填写,而是需用用到哪些就填写哪些参数,总而言之就是根据自己的业务需求去定制自己需要的配置。
const path = require(‘path‘);
module.exports = {
context:__dirname,
entry:"./main.js",
output:{
filename:"[chunkhash].js",
path:path.resolve(__dirname,"./dist"),
}
}
webpack初探 - (一)