配置
webpack是需要传入一个配置对象的,可以通过两种方式:终端或者Node.js来指定配置选项。
注意:配置中使用Node内置的path模块,并在前面加上全局变量__dirname
,可以防止不同操作系统之间的文件路径问题,并且可以使相对路径按照预期工作
配置方式
导出为一个函数
作为导出一个配置对象的替代,可以从webpack配置文件中导出一个函数,该函数在调用事,可传入两个参数:环境对象(environment)作为第一个参数,语法案例可以查看CLI文档的环境选项;map对象(argv)作为第二个参数,这个对象描述了传递给webpack的选项,并且具有output-filename和optimize-minimize等key;
示例:
module.exports=function(env,argv) {
return {
mode:env.production?'production':'development',
devtool:env.production?'source-maps':'eval',
plugins:[
new webpack.optimize.UglifyJsPlugin({
compress:argv['optimize-minimize']
})
]
}
}
导出一个promise
webpack将运行由配置文件导出的函数,并且等待Promise返回。便于需要异步地加载所需的配置变量
module.exports=()=>{
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve({
entry:'./app.js'
})
},5000)
})
}
导出多个配置对象
module.exports = [{
output: {
filename: './dist-amd.js',
libraryTarget: 'amd'
},
entry: './app.js',
mode: 'production',
}, {
output: {
filename: './dist-commonjs.js',
libraryTarget: 'commonjs'
},
entry: './app.js',
mode: 'production',
}]
入口和上下文
entry对象用于webpack查找启动并构建bundle,上下文context是入口文件所处的目录的绝对路径的字符串。
context
类型:string
基础目录,绝对路径,用于从配置中解析入口起点(entry point)和loader
context:path.resolve(__dirname,'app')
默认使用当前目录,但是推荐在配置中传递一个值,便于配置独立于当前执行路径
entry
类型:string | [string] | object { <key>: string | [string] } | (function: () => string | [string] | object { <key>: string | [string] })
起点是应用程序的起点入口。从这个起点开始,应用程序启动执行。如果传递一个数组,那么数组的每一项都会执行。
注意:动态加载的模块不能作为入口起点。
简单规则:每个HTML页面都有一个入口起点。单页应用(SPA):一个入口起点,多页应用(MPA):多个入口起点。
entry : {
home:'./home.js',
about:'./about.js',
contact:'./contact.js'
}
命名
如果传入一个字符串或字符串数组,chunk会被命名为main。如果传入一个对象,则每个键(key)会是chunk的名称,该值描述了chunk的入口起点。
动态入口
entry: () => './demo'
或者
entry:() => new Promise (resolve) => resolve(['./demo','./demo2']);
注意:当结合output.library选项时,如果传入数组,则只导出最后一项。
输出(output)
output
位于对象最顶级键(key),包括了一组选项,指示了webpack如何去输出、以及在哪里输出(bundle、asset和其他所打包或使用webpack载入的任何内容)
output.auxiliaryComment
类型:string || Object
和output.library、output.library
Target一起使用时,此选项允许用户向导出容器(export wrapper)中插入注释。如果要为libraryTarget
每种类型都插入相同的注释,可以将auxiliaryComment
设置为字符串
output:{
library: "someLibName",
libraryTarget: "umd",
filename: "someLibName.js",
auxiliaryComment: "Test Comment"
}
如果想要给libraryTarget
每种类型的注释进行更细粒度的控制,可以传入一个对象
auxiliaryComment: {
root: "Root Comment",
commonjs: "CommonJS Comment",
commonjs2: "CommonJS2 Comment",
amd: "AMD Comment"
}
output.chunkFilename
类型:string || function
此选项决定了非入口(no-entry)chunk文件的名称。可取值,请查看output.filename选项。
注意:这些文件名需要在runtime根据chunk发送的请求去生成。因此需要在webpack runtime 输出bundle值时,将chunk id 的值对应映射到占位符(如[name] 和 [chunkhash])。但是这会增加文件大小,并且在任何chunk的占位符值修改后,都会使bundle失效。
默认使用 [id].js
或从output.filename
中推断出的值([name]会被预先替换为[id]
或[id].
)
output.chunkLoadTimeout
类型:integer
chunk请求到期之前的毫秒数,默认为120000.
注意:webpack2.6.0以上支持此选项
output.crossOriginLoading
类型:boolean string
只用于target是web,使用了通过script标签的JSONP来按需加载chunk
启用cross-origin属性加载chunk。以下是可接手的值:
crossOriginLoading:false //禁用跨域加载(默认)
crossOriginLoading:'anonymous'//不带凭据启用跨域加载
crossOriginLoading:'use-credentials'//带凭据启用跨域加载
output.jsonpScriptType
类型:string
允许自定义script的类型,webpack会将script标签注入到DOM中以下载异步chunk。可以使用以下选项:
- “text/javascript”(默认)
- “module”:与ES6就绪代码一起使用
output.devtoolModuleFilenameTemplate
类型:string | function(info)
此选项仅在devtool使用了需要模块名称的选项时使用
自定义每个source map的sources数组中使用的名称。可以通过传递模块字符串或者函数来完成。
例如,当使用devtool:‘eval’,默认值是:
devtoolModuleFilenameTemplate:'webpack://[namespace]/[resource-path]?[loaders]'
模板字符串列表
模板 | 描述 |
---|---|
[absolute-resource-path] | 绝对路径文件名 |
[all-loaders] | 自动和显示的loader,并且参数取决于第一个loader名称 |
[hash] | 模块标识符的hash |
[id] | 模块标识符 |
[loaders] | 显式的loader,并且参数取决于第一个loader名称 |
[resource] | 用于解析文件的路径和用于第一个loader的任意查询参数 |
[resource-path] | 不带任何查询参数,用于解析文件的路径 |
[namespace] | 模板命名空间。在构建成为一个library之后,通常也是library名称,否则为空 |
当使用一个函数,同样的选项要通过info参数并使用驼峰式
devtollModuleFilenameTemplate:info => {
return `webpack:///${info.resourcePath}?${info.loaders}`
}
output.devtoolFallbackModuleFilenameTemplate
类型:string | function(info)
当上面的模板字符串或函数产生重复时使用的备用内容
output.devtoolNamespace
类型:string
此选项确定了output.devtoolModuleFilenameTemplate使用的模块名称空间。未指定时的默认值为:output.library
。在加载多个通过webpack构建的library时,用于防止sourcemap中源文件路径冲突。
output.filename
类型:string | function
此选项决定了每个输出bundle的名称,这些bundle将写入到output.path选项指定的目录下
对于单个入口起点,filename会是一个静态名称
filename:"bundle.js"
当通过多个入口起点(entry point)、代码拆分(code splitting)或各种插件(plugin)创建多个bundle,应该使用以下一种替换方式,来赋予每个bundle一个唯一的名称
- 使用入口名称
filename:"[name].bundle.js"
- 使用内部chunk.id
filename:"[id].bundle.js"
- 使用每次构建过程中,唯一的hash生成
filename:"[name].[hash].bundle.js"
- 使用基于每个chunk内容的hash
filename:"[chunkhash].bundle.js"
注意:
- 此选项被称为文件名,但是还是可以使用像’js/[name]/bundle.js’这样的文件夹结构
- 此选项不会影响按需加载chunk的输出文件。
模板字符串的值:
模板 | 描述 |
---|---|
[hash] | 模块标识符(module identifier)的hash |
[chunkhash] | chunk内容的hash |
[name] | 模块名称 |
[id] | 模块标识符(module identifier) |
[query] | 模块的query,例如,文件名?后面的字符串 |
[hash]和[chunkhash]的长度可以使用[hash:16] (默认为20)来指定。或者通过指定output.hashDidestLength在全局配置长度
如果将这个选项设为一个函数,函数将返回一个包含上面表格中替换信息的对象
output.hashDigest
在生成hash时使用的编码方式,默认为‘hex’。支持Node.js hash.digest的所有编码
output.hashDigestLength
散列摘要的前缀长度,默认为20
output.hashFunction
类型:string | function
散列算法,默认为’md5’。支持Node.JS ctypto.createHash的所有功能。从4.0.0-alpha2开始,hashFunction 可以返回自定义hash的构造函数。可以提供一个不加密的哈希函数(优化性能)
hashFunction:require('metrohash').MetroHash64
确保hash函数有可访问的update和digest方法
output.hashSalt
可选的加盐值,通过Node.JS hash.update来更新哈希
output.hotUpdateChunkFilename
类型:string | function
自定义热更新chunk的文件名。可选值参考output.filename
选项
占位符只能是[id] 和 [hash],默认值是:
hotUpdateChunkFilename:"[id].[hash].hot-update.js"
output.hotUpdateFunction
类型:function
只在target是web时使用,用于加载热更新(hot update)的JSONP函数
JSONP函数用于异步加载(async load)热更新(hot-update)chunk
output.hotUpdateMainFilename
类型:string | function
自定义热更新的主文件名。可选值参考output.filename
选项
占位符只能是[hash] ,默认值是
hotUpdateMainFilename:"[hash].hot-update.json"
output.jsonpFunction
类型:string
只在target是web时使用,用于按需加载chunk的JSONP函数
JSONP函数用于异步加载chunk,或者拼接多个初始chunk
如果在同一网页中使用了多个webpack runtime,则需要修改此选项
如果使用了output.library选项,library名称是自动追加的
output.library
类型:string | object (webpack3.1.0开始,用于libraryTarget:‘umd’)
output.library的值的作用,取决于output.libraryTarget选项的值;
注意:output.libraryTarget的默认选项是var
所有如果使用以下配置选项:
output:{
library:'Mylibrary'
}
如果生成的输出文件,是在HTML页面中作为一个script标签引入,则变量MyLibray将与入口文件的返回值绑定。
output.libraryTarget
类型:string
默认值:var
用于配置如何暴露library。
注意:此选项与分配给output.library的值一同使用。
常用选项:
- 暴露为一个变量
libraryTraget:'var' // (默认值) 当library加载完成,入口起点的返回值将分配给一个变量
//当使用此选项时,将output.library设置为空,会因为没有变量导致无法赋值
libraryTarget:'assign' //产生一个隐含的全局变量,可能会潜在的重新分配到全局中已存在的值(谨慎使用)
//如果变量名没有在作用域中进行定义,则library将会被设置在全局作用域内
//当使用此项时,将output.library设置为空,将产生一个破损的输出bundle
- 通过在对象上赋值暴露
下列选项将入口起点的返回值赋值给一个特定对象的属性下。如果output.library未赋值为一个非空字符串,则默认行为是,将入口起点返回的所有属性都赋值给一个对象(此对象由output.libraryTarget特定)
注意:不设置output.library将导致由入口起点返回的所有属性,都会被赋值给给定的对象;但是并不会检查现有的属性名是否存在
libraryTarget:'this'
//入口起点的返回值将分配给this的一个属性(此名称由output.library定义)下
libraryTarget:'window'
//入口起点的返回值将使用output.library中定义的值
//分配给window对象的这个属性下
libraryTarget:'global'
//入口起点的返回值将使用output.library中定义的值
//分配给global对象的这个属性下
libraryTarget:'commonjs'
//入口起点的返回值将使用output.library中定义的值,
//分配给exports对象,这个名称意味着,模块用于CommonJS环境
- 模块定义系统
以下选项将导致bundle带有更完整的模块头部,以确保与各种模块系统的兼容性,根据output.libraryTarget选项不同,output.librart选项将具有不同的含义
libraryTarget:'commonjs2'
//入口起点的返回值将分配给module.exports对象。这个名称意味着模块用于CommonJS环境
//注意:output.library会被省略,因此对于此特定的output.libraryTarget,无需再设置output.library
libraryTarget:'amd'
//将library暴露为AMD模块
//AMD模块要求入口chunk通过特定的属性定义
//否则,直接加载生成的AMD bundle将导致报错
libraryTarget:'umd'
//将library暴露为所有的模块定义下都可以运行的方式
//注意:省略library会导致将入口起点返回的所有属性,直接赋值给root对象
注意:从webpack3.1.0开始,可以将library指定为一个对象,用于给每个target起不同的名称
- 其他Targets
libraryTarget:'jsonp'//将入口起点的返回值,包裹到一个jsonp包装容器中
output.path
类型:string
output目录对应一个绝对路径
path:path.resolve(__dirname,'dist/assets')
output.pathinfo
类型:boolean
告诉webpack在bundle中引入所包含模块信息的相关注释。此选项默认值是false,并且不应该用于生产环境。
注意:这些注释也会被添加至经过tree shaking 后生成的bundle中
output.publicPath
类型:string | function
该选项指定了在浏览器中引用的该输出目录对应的公开URL。
对于按需加载或加载外部资源时,output.publickPath十分重要
该选项是以runtime(运行时)或loader(载入时)所创建的每个URL为前缀。因此在多数情况下该选项会以/结束
默认值是一个空字符串""
在编译是无法知道输出文件的publicPath的情况下,可以留空,然后在入口文件处使用自由变量__webpack_public_path_,以便在运行时进行动态设置
output.sourceMapFilename
类型:string
此选项会向硬盘写入一个输出文件,只在devtool启用了SourceMap选项时才使用。
配置source map 的命名方式。默认使用"[file].map"
可以使用#output-filename中[name],[id],[hash]和[chunkhash]替换符号。除此之外,还可以使用以下替换符号。[file]占位符会被替换为原始文件的文件名。
建议只使用[file]占位符,因为其他占位符在非chunk文件生成的SourceMap时不起作用
模板 | 描述 |
---|---|
[file] | 模块文件名称 |
[filebase] | [模块basename] |
output.sourcePrefix
类型:string
修改输出bundle中每行的前缀
sourcePrefix:'\t'
注意:默认情况下使用空字符串。使用一些缩进会看起来美观,但是可能导致多种字符串中的问题
output.strictModuleExceptionHandling
类型:boolean
如果一个模块是在require时抛出异常,告诉webpack从模块实例缓存(require.cache)中删除这个模块。
处于性能原因,默认为false。
当设置为false时,该模块不会从缓存中删除,这将造成仅在第一次require调用时抛出异常(会导致与node.js不兼容)。
output.umdNamedDefine
类型:boolean
当使用了libraryTarget:‘umd’,设置:
umdNamedDefine:true
会对UMD的构建过程中的AMD模块进行命名。否则就使用匿名的define
模块
这些选项决定了如何处理项目中的不同类型的模块
module.noParse
RegExp | [RegExp] | function (从webpack3.0.0开始)
防止webpack解析那些任何与给定正则表达式相匹配的文件。忽略的文件中不应该含有import、require、define的调用,或任何其他导入机制。忽略大型的library可以提高构建性能
noParse:/jquery|lodash/
//从webpack3.0.0开始
noParse:function(content) {
return /jquery|lodash/.test(content)
}
module.rules
类型:array
创建模块时,匹配请求的规则数组。这些规则能够修改模块的创建方式。这些规则能够对模块(module)应用loader,或者修改解析器(parser)
Rule
每个规则可以分为三个部分-条件(condition),结果(result)和嵌套规则(nested rule)
条件
条件有两种输入值:
- resource:请求文件的绝对路径。已经根据resolve规则解析
- issuer:被请求资源的模块文件的绝对路径。是导入时的位置
在规则中,属性test,inculde,exclude和resource对resource匹配,并且属性issuer对issuer匹配
当使用多个条件时,所有条件都匹配
结果
规则结果只在规则条件匹配时使用。
规则有两种输入值:
- 应用的loader:应用唉resource上的loader数组
- Parser选项:用于为模块创建解析器的选项对象
嵌套
可以使用属性rules和oneOf指定嵌套规则
这些规则用于在规则条件匹配时进行取值
Rule.enforce
用于指定loader种类,没有值表示是普通通loader
选项值:‘pre’(优先处理) | ‘post’(最后处理)
还有一个额外的种类行内loader,loader被应用在import/require行内
行内loader
语法介绍:
在import语句或任何等同于import语法
中指定loader,使用!
将资源中的loader分开。每个部分都会相当于当前目录解析
import Styles from 'style-loader!css-loader?modules!./styles.css';
所有loader通过前置、行内、普通、后置
的顺序使用
//所有普通loader可以通过在请求中加上!前缀来忽略(覆盖)配置中的loader
require('!inline-loader!./a.js')
//所有普通和前置 loader 可以通过在请求中加上 -! 前缀来忽略(覆盖)。
require('-!inline-loader!./a.js')
//所有普通,后置和前置 loader 可以通过在请求中加上 !! 前缀来忽略(覆盖)。
require('!!inline-loader!./a.js')
注意:不应该使用行内loader和!前缀,因为它们是非标准的。
Rule.exclude和Rule.include
Rule.exclude和Rule.include是Rule.resource.exclude和Rule.resource.include的简写。如果使用了上述两个选项,则不能使用Rule.resource
Rule.issuer
一个条件,用于与被发布的request对应的模块项匹配。
这个选项可以用来将loader应用到一个特定模块或一组模块的依赖中
Rule.loader
Rule.loader是Rule.user:[{loader}]
的简写
Rule.oneOf
规则数组,当规则匹配时,只使用第一个匹配规则
{
test:/.css$/
oneOf:[
{
resourceQuery:/inline/,//foo.css?inline
use:'url-loader'
},
{
resourceQuery:/external/,//foo.css?external
use:"file-loader"
}
]
}
Rule.options/Rule.query
Rule.options和Rule.query是Rule.use:[{options}]
的简写
Rule.parser
解析选项对象,所有应该的解析选项都将合并
解析器(parser)可以查阅这些选项,并相应的禁用或重新配置。大多数默认插件,配置值如下:
- 将选项设置为false,将禁用解析器
- 将选项设置为true,或不修改将其保留为undefined,可以启用解析器
一些解析器插件不光可以接受一个布尔值,还能接收一个对象
默认的插件解析器选项
parser: {
amd: false, // 禁用 AMD
commonjs: false, // 禁用 CommonJS
system: false, // 禁用 SystemJS
harmony: false, // 禁用 ES2015 Harmony import/export
requireInclude: false, // 禁用 require.include
requireEnsure: false, // 禁用 require.ensure
requireContext: false, // 禁用 require.context
browserify: false, // 禁用特殊处理的 browserify bundle
requireJs: false, // 禁用 requirejs.*
node: false, // 禁用 __dirname, __filename, module, require.extensions, require.main 等。
node: {...} // 在模块级别(module level)上重新配置 node 层(layer)
}
Rule.resource
条件会匹配resource。既可以提供Rule.resource选项,也可以使用快捷选项Rule.test,Rule.exclude和Rule.include
Rule.rules
规则数组,当规则匹配时使用
Rule.test
Rule.test是Rule.resource.test的简写。如果使用了Rule.test选项,就能使用Rule.resource
Rule.use
应用于模块的UseEntries列表。每个入口指定使用一个loader。
传递字符串(如:use:[‘style-loader’])是loader属性的简写方式(如:user:[{loader:‘style-loader’}])
条件
条件可以是:
- 字符串:匹配输入必须以提供的字符串开始。
- 正则表达式:test输入值
- 函数:调用输入的函数,必须返回一个真值以匹配
- 条件数组:至少一个匹配条件
- 对象:匹配所有属性。每个属性都有一个定义行为
条件设置方法:
{test:Condition}
:匹配特定条件。一般是提供一个正则表达式或正则表达式的数组,但不强制。{include:Condition}
:匹配特定条件。一般是提供一个字符串或者字符串数组,但不强制{exclude:Condition}
:排除特定条件。一般是提供一个字符串或字符串数组,但不强制{and:[Condition]}
:必须匹配数组中的所有条件{or:[Condition]}
:匹配数组中任何一个条件{not:[Condition]}
:必须排除这个条件
UseEntry
类型:object
必须有一个loader属性是字符串。它使用loader解析选项相对于配置中的context来解析。
可以有一个options属性为字符串或对象。值可以传递到loader中将其理解为loader选项
由于兼容性原因,也可能有query属性,这个是options属性的别名,使用options属性替代。
例子:
{
loader:'css-loader',
options:{
modules:true
}
}
注意:webpack需要生成资源和所有loader的独立模块标识,包括选项。它尝试对选项对象使用JSON.stringify。这在99.9%的情况下是可以的,但是如果将相同的loader应用于相同资源的不同选项,并且选项具有一些带字符的值,则可能不是唯一的。
如果选项对象不被字符化(例如循环JSON),它也会中断。可以在选项对象使用identity属性,作为唯一标识符
解析 [resolve]
resolve
类型:object
配置模块如何解析。例如,当在ES2015中调用import ‘lodash’,resolve选项能够对webpack查找‘lodash’的方式去做修改
resolve.alias
类型:Object
创建import或require的别名,来确定模块引入变得更简单。可以在给定对象的键后的末尾添加$,以精确匹配。
实例:
别名 | import ‘xyz’ | import ‘xyz/file.js’ |
---|---|---|
{} | /abc/node_modules/xyz/index.js | /abc/node_modules/xyz/file.js |
{xyz:’/abs/path/to/file.js’} | /abs/path/to/file.js | error |
{ xyz$: “/abs/path/to/file.js” } | /abs/path/to/file.js | /abc/node_modules/xyz/file.js |
{ xyz: “./dir/file.js” } | /abc/dir/file.js | error |
{ xyz$: “./dir/file.js” } | /abc/dir/file.js | /abc/node_modules/xyz/file.js |
{ xyz: “/some/dir” } | /some/dir/index.js | /some/dir/file.js |
{ xyz$: “/some/dir” } | /some/dir/index.js | /abc/node_modules/xyz/file.js |
resolve.aliasFields
类型:[string]
在模块的package.json中指定一个字段,例如browser,按照此规范进行解析。默认:
aliasFields:['browser']
resolve.cacheWithContext
类型:boolean(从webpack3.1.0开始)
如果启用了不安全缓存,请在缓存键(cache key)中引入request.context。这个选项被enhanced-resolve模块考虑在内。从webpack3.1.0开始,在配置了resolve或resolveLoader插件时,解析缓存(resolve caching)中的上下文(context)会被忽略。这解决了性能衰退的问题
resolve.descriptionFiles
类型:array
用于描述的JOSN文件。默认:
descriptionFiles:['package.json']
resolve.enforceExtension
类型:boolean
设置为true,将不允许无扩展名(extension-less)文件。默认如果./foo
有.js
扩展,require('./foo')
可以正常运行。但如果启用此选项,只有require('./foo.js')
可以正常运行。默认:
enforceExtension:false
resolve.enforceModuleExtension
类型:boolean
对模块是否需要使用的扩展(例如loader)。默认
enforceModuleExtension:false
resolve.extensions
类型:array
自动解析确定的扩展。默认值为:
extensions:[".js",".json"]
能够使用户在引入模块时不带扩展
import File from '../path/to/file'
注意:使用此选项,会覆盖默认数组,这就意味着webpack将不再尝试使用默认扩展来解析模块。对于使用其扩展导入的模块,例如,import SomeFile from "./somefile.ext
,要想正确的解析,一个包含“*”的字符串必须包含在数组中。
resolve.mainFields
类型:array
当从npm包中导入模块时(例如import * as D3 from ‘d3’),此选项将决定package.json中使用哪个字段导入模块。根据webpack配置中指定的target不同,默认值也会有所不同
当target属性设置webworker,web或者没有指定,默认值为:
mainFields:['browser','module','main']
对于其他任意的target(包括node),默认值为:
mainFields:["module","main"]
实例:
D3的package.json如下
{
main: 'build/d3.Node.js',
browser: 'build/d3.js',
module: 'index',
}
这意味着 import * as D3 from “d3”,实际从 browser 属性解析文件。在这里 browser 属性是最优先选择的,因为它是 mainFields 的第一项。同时,由 webpack 打包的 Node.js 应用程序默认会从 module 字段中解析文件。
resolve,mainFiles
类型:array
解析目录时要使用的文件名,默认:
mainFiles:["index"]
resolve.modules
类型:array
告诉webpack解析模块时应该搜索的目录。
绝对路径和相对路径都能使用。其中相对路径通过查看当前目录以及祖先路径;使用绝对路径,将只在给定目录中搜索;
默认值:
modules:['mode_modules']
如果添加一个目录到模块搜索目录,此目录将优先于node_modules
搜索
modules:[path.resolve(__dirname,"src"),"node_modules"]
resolve.unsafeCache
类型:regex | array | boolean
默认:
unsafeCache:true
启用,会主动缓存模块,单并不安全。传递true
将缓存一切
也可以是正则表达式或者正则表达式数组,可以用于匹配文件路径或只缓存某些模块,例如,只缓存utilities模块
unsafeCache:/src\/utilities/
注意:修改缓存路径可能在极少数情况下导致失败
resolve.plugins
应该使用的额外的解析插件列表。运行使用插件。例子:
plugins:[
new DirectoryNamedWebpackPlugin()
]
resolve.symlinks
类型:boolean
是否将符号链接解析到对应的符号链接位置。默认值为:
symlinks:true
启用时,符号链接的资源,将解析为其真实路径,而不是其符号链接位置。
注意:当使用符号链接package包工具时,可能会导致模块解析失败
resolve.cachePredicate
类型:function
决定请求是否应该被缓存的函数。函数传入一个带有path和request属性的对象。默认:
cachePredicate:function(){return true}
resolveLoader
类型:object
用于解析webpack的loader包,默认:
{
modules:['node_modues'],
extensions:['.js','json'],
mainFields:['loader','main']
}
注意:这里可以使用别名,并且其他特性类似于resolve对象。例如,{txt:'row-loader'}
会使用raw-loader去shim(填充)txt!templates/demo.txt
resolveLoader.moduleExtensions
类型:array
解析loader时,用到扩展名(extendsions)/后缀(suffixes)。建议使用全名。但是如果想要省略-loader
,可以使用此选项实现
moduleExtensions:[’-loader’]
插件[plugins]
plugins选项用于以各种方式自定义webpack构建过程。webpack附带了各种内置插件,可以通过webpack.[plugin-name]访问这些插件。插件列表和对应文档
plugins
类型:array
webpack插件列表
实例:
var webpack = require('webpack');
// 导入非 webpack 自带默认插件
var ExtractTextPlugin = require('extract-text-webpack-plugin');
var DashboardPlugin = require('webpack-dashboard/plugin');
// 在配置中添加插件
plugins: [
// 构建优化插件
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
filename: 'vendor-[hash].min.js',
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false,
drop_console: false,
}
}),
new ExtractTextPlugin({
filename: 'build.min.css',
allChunks: true,
}),
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
// 编译时(compile time)插件
new webpack.DefinePlugin({
'process.env.NODE_ENV': '"production"',
}),
// webpack-dev-server 强化插件
new DashboardPlugin(),
new webpack.HotModuleReplacementPlugin(),
]