在项目下建立一个webpack.config.js(默认,可修改)文件来配置webpackcss
module.exports = { entry: '', // 入口文件 output: {}, // 出口文件 module: {}, // 处理对应模块 plugins: [], // 对应的插件 devServer: {}, // 开发服务器配置 mode: 'development' // 模式配置 }
以上就是webpack的正常配置模块node
工程资源的入口,它能够是单个文件也能够是多个文件。webpack
Entry 类型web
module.exports = { entry: './app.js' }
module.exports = { entry: ['./app.js','./index.js'] }
module.exports = { entry: {index,'./index.js',app,'./app.js'} //index表示独特的chunk }
Webpack 在寻找相对路径的文件时会以 context 为根目录,context 默认为执行启动 Webpack 时所在的当前工做目录。 若是想改变 context 的默认配置,则能够在配置文件里这样设置它:数组
module.exports = { context: path.resolve(__dirname, 'app') }
Webpack 会为每一个生成的 Chunk 取一个名称,Chunk 的名称和 Entry 的配置有关:缓存
假如项目里有多个页面须要为每一个页面的入口配置一个 Entry ,但这些页面的数量可能会不断增加,则这时 Entry 的配置会受到到其余因素的影响致使不能写成静态的值。其解决方法是把 Entry 设置成一个函数去动态返回上面所说的配置,代码以下:sass
// 同步函数 entry: () => { return { a:'./pages/a', b:'./pages/b', } }; // 异步函数 entry: () => { return new Promise((resolve)=>{ resolve({ a:'./pages/a', b:'./pages/b', }); }); };
这是一个配置对象,经过它咱们能够对最终打包的产物进行配置。服务器
output.filename 配置输出文件的名称,为string 类型。babel
const path = require('path'); module.exports = { entry: './app.js', output: { path: path.join(__dirname, 'dist'), //打包资源放置的路径,必须为绝对路径。 filename: 'bundle.js' //打包结果的文件名。 } }
const path = require('path'); module.exports = { entry: {index,'./index.js',app,'./app.js'}, output: { path: path.join(__dirname, 'dist'), filename: '[name].min.[hash:5].js' } }
output.chunkFilename 配置无入口的 Chunk 在输出时的文件名称。 chunkFilename 和上面的 filename 很是相似,但 chunkFilename 只用于指定在运行过程当中生成的 Chunk 在输出时的文件名称。 常见的会在运行时生成 Chunk 场景有在使用 CommonChunkPlugin、使用 import('path/to/module') 动态加载等时。 chunkFilename 支持和 filename 一致的内置变量。app
output.path 配置输出文件存放在本地的目录,必须是 string 类型的绝对路径。一般经过 Node.js 的 path 模块去获取绝对路径:
path: path.resolve(__dirname, 'dist_[hash]')
output.publicPath 配置发布到线上资源的 URL 前缀,为string 类型。 默认值是空字符串 '',即便用相对路径。
须要把构建出的资源文件上传到 CDN 服务上,以利于加快页面的打开速度。配置代码以下:
filename:'[name]_[chunkhash:8].js' publicPath: 'https://cdn.example.com/assets/'
这时发布到线上的 HTML 在引入 JavaScript 文件时就须要:
<script src='https://cdn.example.com/assets/a_12345678.js'></script>
使用该配置项时要当心,稍有不慎将致使资源加载404错误。
module 配置如何处理模块。
处理文件,Webpack 自己只能处理 JavaScript,而对于别的类型的语法则彻底不认识。若是咱们须要引入某一类型的模块,那么就须要经过为它添加特性类型的 loader。
rules 配置模块的读取和解析规则,一般用来配置 Loader。其类型是一个数组,数组里每一项都描述了如何去处理部分文件。
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'), ] }
经常使用 Loader
Plugin 用于扩展 Webpack 功能,各类各样的 Plugin 几乎让 Webpack 能够作任何构建相关的事情。
Plugin 的配置很简单,plugins 配置项接受一个数组,数组里每一项都是一个要使用的 Plugin 的实例,Plugin 须要的参数经过构造函数传入。
const CommonsChunkPlugin = require('webpack/lib/optimize/CommonsChunkPlugin'); module.exports = { plugins: [ // 全部页面都会用到的公共代码提取到 common 代码块中 new CommonsChunkPlugin({ name: 'common', chunks: ['a', 'b'] }), ] };
经常使用 Plugins
至关于代码块
打包后的一捆代码
模块