module
配置如何处理模块。css
rules 配置模块的读取和解析规则,一般用来配置 Loader。其类型是一个数组,数组里每一项都描述了如何去处理部分文件。 配置一项 rules
时大体经过如下方式:node
use
配置项来应用 Loader,能够只应用一个 Loader 或者按照从后往前的顺序应用一组 Loader,同时还能够分别给 Loader 传入参数。enforce
选项可让其中一个 Loader 的执行顺序放到最前或者最后。下面来经过一个例子来讲明具体使用方法:jquery
module: { rules: [ { // 命中 JavaScript 文件 test: /\.js$/, // 用 babel-loader 转换 JavaScript 文件 // ?cacheDirectory 表示传给 babel-loader 的参数,用于缓存 babel 编译结果加快从新编译速度 use: ['babel-loader?cacheDirectory'], // 只命中src目录里的js文件,加快 Webpack 搜索速度 include: path.resolve(__dirname, 'src') }, { // 命中 SCSS 文件 test: /\.scss$/, // 使用一组 Loader 去处理 SCSS 文件。 // 处理顺序为从后到前,即先交给 sass-loader 处理,再把结果交给 css-loader 最后再给 style-loader。 use: ['style-loader', 'css-loader', 'sass-loader'], // 排除 node_modules 目录下的文件 exclude: path.resolve(__dirname, 'node_modules'), }, { // 对非文本文件采用 file-loader 加载 test: /\.(gif|png|jpe?g|eot|woff|ttf|svg|pdf)$/, use: ['file-loader'], }, ] }
在 Loader 须要传入不少参数时,你还能够经过一个 Object 来描述,例如在上面的 babel-loader 配置中有以下代码:正则表达式
use: [ { loader:'babel-loader', options:{ cacheDirectory:true, }, // enforce:'post' 的含义是把该 Loader 的执行顺序放到最后 // enforce 的值还能够是 pre,表明把 Loader 的执行顺序放到最前面 enforce:'post' }, // 省略其它 Loader ]
上面的例子中 test include exclude
这三个命中文件的配置项只传入了一个字符串或正则,其实它们还都支持数组类型,使用以下:数组
{ test:[ /\.jsx?$/, /\.tsx?$/ ], include:[ path.resolve(__dirname, 'src'), path.resolve(__dirname, 'tests'), ], exclude:[ path.resolve(__dirname, 'node_modules'), path.resolve(__dirname, 'bower_modules'), ] }
数组里的每项之间是或的关系,即文件路径符合数组中的任何一个条件就会被命中。浏览器
noParse
配置项可让 Webpack 忽略对部分没采用模块化的文件的递归解析和处理,这样作的好处是能提升构建性能。 缘由是一些库例如 jQuery 、ChartJS 它们庞大又没有采用模块化标准,让 Webpack 去解析这些文件耗时又没有意义。缓存
noParse
是可选配置项,类型须要是 RegExp
、[RegExp]
、function
其中一个。sass
例如想要忽略掉 jQuery 、ChartJS,可使用以下代码:babel
// 使用正则表达式 noParse: /jquery|chartjs/ // 使用函数,从 Webpack 3.0.0 开始支持 noParse: (content)=> { // content 表明一个模块的文件路径 // 返回 true or false return /jquery|chartjs/.test(content); }
import
、 require
、 define
等模块化语句,否则会致使构建出的代码中包含没法在浏览器环境下执行的模块化语句。由于 Webpack 是以模块化的 JavaScript 文件为入口,因此内置了对模块化 JavaScript 的解析功能,支持 AMD、CommonJS、SystemJS、ES6。 parser
属性能够更细粒度的配置哪些模块语法要解析哪些不解析,和 noParse
配置项的区别在于 parser
能够精确到语法层面, 而 noParse 只能控制哪些文件不被解析。 parser
使用以下:app
module: { rules: [ { test: /\.js$/, use: ['babel-loader'], parser: { amd: false, // 禁用 AMD commonjs: false, // 禁用 CommonJS system: false, // 禁用 SystemJS harmony: false, // 禁用 ES6 import/export requireInclude: false, // 禁用 require.include requireEnsure: false, // 禁用 require.ensure requireContext: false, // 禁用 require.context browserify: false, // 禁用 browserify requireJs: false, // 禁用 requirejs } }, ] }