文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
五、使用 plugin
更多的插件可以在这里查找: plugins in awesome-webpack
5.1 DefinePlugin
DefinePlugin
是 webpack
内置的插件,可以使用 webpack.DefinePlugin
直接获取
- 这个插件用于创建一些在编译时可以配置的全局常量,这些常量的值我们可以在
webpack
的配置中去指定,例如
module.exports = { // ... plugins: [ new webpack.DefinePlugin({ PRODUCTION: JSON.stringify(true), // const PRODUCTION = true VERSION: JSON.stringify('5fa3b9'), // const VERSION = '5fa3b9' BROWSER_SUPPORTS_HTML5: true, // const BROWSER_SUPPORTS_HTML5 = 'true' TWO: '1+1', // const TWO = 1 + 1, CONSTANTS: { APP_VERSION: JSON.stringify('1.1.2') // const CONSTANTS = { APP_VERSION: '1.1.2' } } }), ], }...
有了上面的配置,就可以在应用代码文件中,访问配置好的变量了,如:
console.log("Running App version " + VERSION); if(!BROWSER_SUPPORTS_HTML5) require("html5shiv");
上面配置的注释已经简单说明了这些配置的效果,这里再简述一下整个配置规则。
- 如果配置的值是字符串,那么整个字符串会被当成代码片段来执行,其结果作为最终变量的值,如上面的
"1+1"
,最后的结果是2
- 如果配置的值不是字符串,也不是一个对象字面量,那么该值会被转为一个字符串,如
true
,最后的结果是'true'
- 如果配置的是一个对象字面量,那么该对象的所有
key
会以同样的方式去定义 - 这样我们就可以理解为什么要使用
JSON.stringify()
了,因为JSON.stringify(true)
的结果是'true'
,JSON.stringify("5fa3b9")
的结果是"5fa3b9"
。
社区中关于 DefinePlugin
使用得最多的方式是定义环境变量,例如 PRODUCTION = true
或者 __DEV__ = true
等。部分类库在开发环境时依赖这样的环境变量来给予开发者更多的开发调试反馈,例如 react 等。
- 建议使用
process.env.NODE_ENV
: … 的方式来定义process.env.NODE_ENV
,而不是使用process: { env: { NODE_ENV: ... } }
的方式,因为这样会覆盖掉process
这个对象,可能会对其他代码造成影响…
5.2 copy-webpack-plugin
我们一般会把开发的所有源码和资源文件放在 src/
目录下,构建的时候产出一个 build/
目录,通常会直接拿 build
中的所有文件来发布。有些文件没经过 webpack
处理,但是我们希望它们也能出现在 build
目录下,这时就可以使用 CopyWebpackPlugin
来处理了…
const CopyWebpackPlugin = require('copy-webpack-plugin') module.exports = { // ... plugins: [ new CopyWebpackPlugin([ { from: 'src/file.txt', to: 'build/file.txt', }, // 顾名思义,from 配置来源,to 配置目标路径 { from: 'src/*.ico', to: 'build/*.ico' }, // 配置项可以使用 glob // 可以配置很多项复制规则 ]), ], }...
5.3 extract-text-webpack-plugin
我们用它来把依赖的 CSS
分离出来成为单独的文件。这里再看一下使用 extract-text-webpack-plugin
的配置
const ExtractTextPlugin = require('extract-text-webpack-plugin') module.exports = { // ... module: { rules: [ { test: /\.css$/, // 因为这个插件需要干涉模块转换的内容,所以需要使用它对应的 loader use: ExtractTextPlugin.extract({ fallback: 'style-loader', use: 'css-loader', }), }, ], }, plugins: [ // 引入插件,配置文件名,这里同样可以使用 [hash] new ExtractTextPlugin('index.css'), ], }...
在上述的配置中,我们使用了 index.css
作为单独分离出来的文件名,但有的时候构建入口不止一个, extract-text-webpack-plugin
会为每一个入口创建单独分离的文件,因此最好这样配置
// 这样确保在使用多个构建入口时,生成不同名称的文件 plugins: [ new ExtractTextPlugin('[name].css'), ],
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论