webpack是一个现代JavaScript应用程序的静态模块打包器。当webpack处理程序时,它会递归地构建一个依赖关系图,其中包含应用程序需要的每个模块,然后将这些模块打包成一个或多个bundle
webpack四个核心概念
- 入口(entry)
- 输出(output)
- loader
- 插件(plugins)
1. 入口(entry)
1. 单个入口
1 2 3 4 5 6 7 8 9 10
| module.exports = { entry: '../src/index.js' }
module.exports = { entry: { main: '../src/index.js' } }
|
2. 多个入口
1 2 3 4 5 6
| module.exports = { entry: { main: '../src/index.js', app: '../src/app.js' } }
|
3. 分离应用程序(app)和第三方库(vendor)入口
1 2 3 4 5 6
| module.exports = { entry: { app: '../src/index.js', vendor: '../vendor/index.js' } }
|
2. 输出(output)
配置 output
选项可以控制 webpack 如何向硬盘写入编译文件。注意,即使可以存在多个入口
起点,但只指定一个输出
配置。
1. 基础用法
1 2 3 4 5 6
| module.exports = { output: { filename: 'bundle.js', path: path.resolve(__dirname, '../dist') } }
|
2. 多个入口
如果配置创建了多个单独的 “chunk”(例如,使用多个入口起点或使用像 CommonsChunkPlugin 这样的插件),则应该使用占位符(substitutions)来确保每个文件具有唯一的名称。
1 2 3 4 5 6 7 8 9 10
| module.exports = { entry: { app: '../src/app.js', search: '../src/search.js' }, output: { filename: '[name].js', path: path.resolve(__dirname, '../dist') } }
|
3. mode
提供 mode
配置选项,告知 webpack 使用相应模式的内置优化.
在配置中提供mode参数
1 2 3
| module.exports = { mode: 'production' }
|
从CLI参数中传递
1
| webpack --mode=development
|
4. loader
loader用于对模块的源代码进行转换,loader对非JavaScript文件进行预处理,将其转换为JavaScript能加载的模块,如将内联图像转换为data URL。
对不同类型的非JavaScript文件进行处理应该先安装对应的loader。
1 2
| npm install css-loader --save-dev npm install ts-loader --save-dev
|
在应用程序中,有三种使用loader的方式:
1. webpack配置
1 2 3 4 5 6 7 8
| module.exports = { module: { rules: [ { test: /\.css$/, use: 'css-loader' }, { test: /\.ts$/, use: 'ts-loader' } ] } }
|
2. 内联
1
| import Styles from 'style-loader!css-loader?modules!./styles.css';
|
3. 使用CLI参数
1
| webpack --module-bind jade-loader --module-bind 'css=style-loader!css-loader'
|
5. plugins
插件目的在于解决 loader 无法实现的其他事
1 2 3 4 5 6
| module.exports = { plugins: [ new webpack.optimize.UglifyJsPlugin(), new HtmlWebpackPlugin({ template: '../src/index.html' }) ] }
|