04-webpack: plugins
/** plugin: 1.完成loader不能完成的事情 2.本质上是一个具有 apply 方法的 JavaScript 对象。apply 方法会被 webpack compiler 调用,并且在整个编译生命周期都可以访问 compiler 对象 3.配置方式引入示例: plugins: [ new webpack.ProgressPlugin(), new HtmlWebpackPlugin({ template: './src/index.html' }), ] 4.Node API方式引入 const webpack = require('webpack'); // 访问 webpack 运行时(runtime) const configuration = require('./webpack.config.js'); let compiler = webpack(configuration); new webpack.ProgressPlugin().apply(compiler); compiler.run(function (err, stats) { // ... }); node API 方式引入可以看出,webpack 本质是一个函数,函数调用时接收 配置的 config options, 返回一个编译对象 compiler。 编译过程就是 compiler 对象中方法执行的过程 5.常用plugin,以及作用,参考 https://www.cnblogs.com/susu2020/p/12517001.html 1. webpack内置压缩代码插件: UglifyJsPlugin new UglifyJsPlugin({ parallel: 4, uglifyOptions: { output: { comments: false, beautify: false, }, compress: { warnings: false }, }, cache: true, }) 2. webpack内置提高打包效率,将第三方库和业务代码分开打包:CommonsChunkPlugin new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', filename: "js/vendor.js", children: true, minChunks: Infinity, }) 3. webpack内置自动加载模块,代替require和import插件:ProvidePlugin。 new webpack.ProvidePlugin({ //自动加载模块 '$': "jquery", 'jQuery': "jquery", 'window.jQuery': "jquery", 'window.$': 'jquery' }) 也可以配置全局方法 new webpack.ProvidePlugin({ _deepCopy: [path.join(__dirname, 'src/tools/index.js'),'deepCopy'], // 深拷贝函数 _formatTime: 'dayjs', // dayjs 插件 }) 4. webpack内置生成html文件的插件:html-webpack-plugin 生成HTML文件,并且在body中使用script标签引入你所有webpack生成的 bundle.js new HtmlWebpackPlugin({ template: 'src/index.html', }) 5. extract-text-webpack-plugin:将css模块和js模块分开打包,换句话说把css代码从js文件中抽离出来,单独出一个模块。https://blog.csdn.net/weixin_41134409/article/details/88416356 const ExtractTextPlugin = require("extract-text-webpack-plugin"); //记得先install该模块 /** ExtractTextPlugin.extract 提取样式函数参数说明: use:指需要什么样的loader去编译文件 fallback: 这里表示不提取的时候,使用什么样的配置来处理css publicfile:用来覆盖项目路径,生成该css文件的文件路径 **/ module: { rules: [ { test: /\.vue$/, loader: 'vue-loader', options: { loaders: { scss: ExtractTextPlugin.extract({ fallback: 'vue-style-loader', use: 'css-loader!sass-loader' }) css: ExtractTextPlugin.extract({ fallback: 'vue-style-loader', use: 'css-loader' }), } } }, { test: /\.css$/, use: ExtractTextPlugin.extract({ //css的提取 fallback: "style-loader", use: "css-loader" }) }, { test: /\.scss$/, use: ExtractTextPlugin.extract({ //css的提取 fallback: "style-loader", use: ['sass-loader','postcss-loader'] }) } ] }, plugins: [ new ExtractTextPlugin({ filename: 'css/[name].[contenthash].css', allChunks: true //当为false的时候,只会提取初始化的时候引入的css,当allChunks属性为true时,会把异步引入的css也提取出来 }) ] 6. compression-webpack-plugin:生产环境可采用gzip压缩JS和CSS new CompressionPlugin({ //打包文件为giz格式 filename: '[path].gz[query]', //目标资源名称。[file] 会被替换成原资源。[path] 会被替换成原资源路径,[query] 替换成原查询字符串 algorithm: 'gzip',//算法 test: new RegExp('\\.(js|css)$'), threshold: 10240,//只处理比这个值大的资源。按字节计算 minRatio: 0.8//只有压缩率比这个值小的资源才会被处理 }) 7. CleanWebpackPlugin:重构之前删除dist文件,除dist/img文件 new CleanWebpackPlugin({ cleanOnceBeforeBuildPatterns:['**/*', '!img', '!img/**'] }) 6.自定义plugin const pluginName = 'ConsoleLogOnBuildWebpackPlugin'; class ConsoleLogOnBuildWebpackPlugin { apply(compiler) { compiler.hooks.run.tap(pluginName, (compilation) => { console.log('webpack 构建正在启动!'); }); } } module.exports = ConsoleLogOnBuildWebpackPlugin; **/