当前位置: 首页 > news >正文

【webpack】wabpack5 常用配置

开发配置

const { Configuration } = require('webpack')const path = require('path')
// 导入 eslint 插件
const ESLintPlugin = require('eslint-webpack-plugin')
// 导入 html插件
const HtmlWebpackPlugin = require('html-webpack-plugin')// webpack5 基本配置
/*** @type {Configuration}*/
module.exports = {// 入口entry: './src/main.js',// 输出output: {path: undefined,filename: 'static/js/bundle.js',clean: true,},// 开发模式mode: 'development',// 添加开发环境代码映射devtool: 'eval-source-map',// 别名resolve: {alias: {'@': path.resolve(__dirname, '../src'),},},// 加载器module: {rules: [{oneOf: [// 处理.js文件,进行兼容性处理{test: /\.js$/,exclude: /node_modules/,use: {loader: 'babel-loader',options: {// 开启babel缓存cacheDirectory: true,// 关闭缓存文件压缩cacheCompression: true,// 减少代码体积插件plugins: ['@babel/plugin-transform-runtime'],},},},// 处理.css文件{test: /\.css$/i,use: ['style-loader', 'css-loader'],// use: ['../loaders/style-loader', 'css-loader'],},// 处理.less文件{test: /\.less$/i,use: ['style-loader', 'css-loader', 'less-loader'],},// 处理.sass或.scss文件{test: /\.(scss|sass)$/i,use: ['style-loader', 'css-loader', 'sass-loader'],},// 处理.styl文件{test: /\.styl$/i,use: ['style-loader', 'css-loader', 'stylus-loader'],},// 处理图片资源,无需下载依赖,webpack内置{test: /\.(png|jpe?g|gif|webp)$/i,type: 'asset',parser: {dataUrlCondition: {maxSize: 10 * 1024, // 小于10kb转为base64,默认小于8kb},},// 修改输出目录generator: {filename: 'static/images/[name].[hash:8][ext]',},},// 处理字体文件,不转base64{test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i,type: 'asset/resource',generator: {filename: 'static/fonts/[name].[hash:8][ext]',},},// 处理md文件{test: /\.md$/i,loader: path.resolve(__dirname, '../build/md-loader.js'),// loader: 'html-loader',},// 处理svg文件{test: /\.svg$/i,type: 'asset/resource',generator: {filename: 'static/images/[name].[hash:8][ext]',},}],},],},// 插件plugins: [// 添加 eslint 规则,打包时有效new ESLintPlugin({context: path.resolve(__dirname, '../src'),// 相对context的路径exclude: ['./assets'],}),// 使用html插件自动引入打包文件new HtmlWebpackPlugin({template: path.resolve(__dirname, '../public/index.html'),}),],// 配置开发服务器devServer: {host: 'localhost',port: 3000,open: true,// 热替换,默认开启且只对样式有效,js模块需要单独写代码(vue-loader等就是这样)// hot: true,// 配置代理proxy: {'/api': {// 目标服务器target: 'http://127.0.0.1:3000',// 路径重写pathRewrite: {'^/api': '',},},},},
}

2、生产配置

const { Configuration } = require('webpack')const path = require('path')
// 获取线程数
const os = require('os')
const threads = os.cpus()?.length ? os.cpus().length - 1 : 1// 导入 eslint 插件
const ESLintPlugin = require('eslint-webpack-plugin')
// 导入 html 插件
const HtmlWebpackPlugin = require('html-webpack-plugin')
// 导入抽离 css 样式插件
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
// 导入压缩样式插件
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin')
// 导入压缩js插件
const TerserPlugin = require('terser-webpack-plugin')
// 导入preload插件
const PreloadWebpackPlugin = require('@vue/preload-webpack-plugin')
// 自定义打包文件分析插件
const AnalyzeWebpackPlugin = require('../plugins/analyze-plugins')// 定义返回样式 loader 的方法
const getStyleLoaders = preProcessor => {const loaders = [MiniCssExtractPlugin.loader,'css-loader',{loader: 'postcss-loader',options: {postcssOptions: {plugins: ['postcss-preset-env'],},},},]if (preProcessor) {loaders.push(preProcessor)}return loaders
}// webpack5 基本配置
/*** @type {Configuration}*/
module.exports = {// 入口entry: './src/main.js',// 输出output: {path: path.resolve(__dirname, '../dist'),filename: 'static/js/[name].[hash:8].js',// 清空上次打包内容clean: true,// 给打包的chunk文件命名chunkFilename: 'static/js/[name].[hash:8].chunk.js',// 给type: 'asset'静态资源命名assetModuleFilename: 'static/media/[name].[hash:8][ext]',},// 生产模式mode: 'production',// 别名resolve: {alias: {'@': path.resolve(__dirname, '../src'),},},// 加载器module: {rules: [{// 每个文件只会匹配一种规则就结束oneOf: [// 处理.js文件,进行兼容性处理{test: /\.js$/,exclude: /node_modules/,use: [// 使用thread-loader,开启多线程{loader: 'thread-loader',options: {workers: threads,},},{loader: 'babel-loader',options: {// 开启babel缓存cacheDirectory: true,// 关闭缓存文件压缩cacheCompression: false,// 减少代码体积插件,plugins: ['@babel/plugin-transform-runtime'],},},],},// 处理.css文件{test: /\.css$/i,use: getStyleLoaders(),},// 处理.less文件{test: /\.less$/i,use: getStyleLoaders('less-loader'),},// 处理.sass或.scss文件{test: /\.(scss|sass)$/i,use: getStyleLoaders('sass-loader'),},// 处理.styl文件{test: /\.styl$/i,use: getStyleLoaders('stylus-loader'),},// 处理图片资源,无需下载依赖,webpack内置{test: /\.(png|jpe?g|gif|webp)$/i,type: 'asset',parser: {dataUrlCondition: {maxSize: 10 * 1024, // 小于10kb转为base64,默认小于8kb},},},// 处理字体文件,不转base64{test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/i,type: 'asset/resource',},// 处理md文件{test: /\.md$/i,loader: path.resolve(__dirname, '../build/md-loader.js'),// loader: 'html-loader',},],},],},// 插件plugins: [// 添加 eslint 规则,打包时有效new ESLintPlugin({context: path.resolve(__dirname, '../src'),// 相对context的路径exclude: ['./assets'],// 开启多线程threads,}),// 使用html插件自动引入打包文件new HtmlWebpackPlugin({template: path.resolve(__dirname, '../public/index.html'),}),// 使用抽离样式插件new MiniCssExtractPlugin({filename: 'static/css/[name].[hash:8].css',chunkFilename: 'static/css/[name].[hash:8].chunk.css',}),// 使用开启preload的插件new PreloadWebpackPlugin({rel: 'preload',as: 'script',}),new AnalyzeWebpackPlugin(),],// 优化配置optimization: {minimizer: [// 使用压缩样式插件new CssMinimizerPlugin(),// 使用压缩js插件new TerserPlugin({parallel: threads,}),],splitChunks: {chunks: 'all',},runtimeChunk: {name: entrypoint => `runtime-${entrypoint.name}`,},},}

3、自定义loader

loader本质就是一个module.exports导出一个函数,这个函数的返回值是可以执行的js代码;
以下实现类似 style-loader 功能

module.exports = function () {}
module.exports.pitch = function (remainingRequest) {// D:\前端\my-webpack\node_modules\css-loader\dist\cjs.js!D:\前端\my-webpack\src\assets\styles\index.cssconst relativePath = remainingRequest.split('!').map(absolutePath => {return this.utils.contextify(this.context, absolutePath)}).join('!')// ../../../node_modules/css-loader/dist/cjs.js!./index.cssreturn `import style from '!!${relativePath}'const styleEl = document.createElement('style');styleEl.innerHTML = style;document.head.appendChild(styleEl);`
}

4、自定义插件

插件本质是一个导出一个类,内部有各种生命周期钩子;
以下实现打包后生成文件大小分析报告;

// 一个 JavaScript 类
class AnalyzeWebpackPlugin {apply(compiler) {// 在打包压缩后,资源输出前执行compiler.hooks.emit.tap('AnalyzeWebpackPlugin', compilation => {// 获取打包后资源的文件名和大小const assets = Object.entries(compilation.assets)let source = '# 打包文件大小分析 \n|名称|大小|\n|-|-|'assets.forEach(([fileName, file]) => {source += `\n|${fileName}|${Math.ceil(file.size() / 1024)}kb|`})// 输出分析报告compilation.assets['analyze.md'] = {source() {return source},size() {return source.length},}})}
}module.exports = AnalyzeWebpackPlugin

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【ORACLE】minus() 函数
  • [数据集][目标检测]快递包裹检测数据集VOC+YOLO格式5382张1类别
  • 聚星文社——Ai推文工具
  • docker-harbor 仓库上传下载镜像以及仓库之间的镜像复制
  • 自学Python网站
  • 前端网格布局display: grid;
  • 论文期刊介绍
  • 7. Java 中 HashMap 的扩容机制是怎样的?
  • iOS开发进阶(二十三):iOS 常见面试题汇总
  • uniapp h5手机如何打开本地跑的前端项目进行本地调试
  • 亿发工单管理系统助力五金行业智造升级:高效生产新篇章
  • [数据集][目标检测]竹子甘蔗发芽缺陷检测数据集VOC+YOLO格式2953张3类别
  • NGINX高性能web服务器
  • 20240826日报
  • XML 总结
  • 深入了解以太坊
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • @angular/forms 源码解析之双向绑定
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • Codepen 每日精选(2018-3-25)
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • jQuery(一)
  • Mac转Windows的拯救指南
  • python_bomb----数据类型总结
  • vue学习系列(二)vue-cli
  • 关于List、List?、ListObject的区别
  • 什么软件可以剪辑音乐?
  • 小程序01:wepy框架整合iview webapp UI
  • 赢得Docker挑战最佳实践
  • Linux权限管理(week1_day5)--技术流ken
  • puppet连载22:define用法
  • raise 与 raise ... from 的区别
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # 数论-逆元
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (1)(1.13) SiK无线电高级配置(六)
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (笔试题)分解质因式
  • (层次遍历)104. 二叉树的最大深度
  • (二)构建dubbo分布式平台-平台功能导图
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (几何:六边形面积)编写程序,提示用户输入六边形的边长,然后显示它的面积。
  • (六)Hibernate的二级缓存
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (五)网络优化与超参数选择--九五小庞
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • .Net 4.0并行库实用性演练
  • .NetCore项目nginx发布
  • @Autowired 与@Resource的区别
  • @JSONField或@JsonProperty注解使用
  • @RequestMapping 和 @GetMapping等子注解的区别及其用法
  • @Transactional 详解
  • [30期] 我的学习方法