当前位置: 首页 > Web前端 > HTML

webpack配置用到的库和知识点

时间:2023-03-28 15:34:18 HTML

webpack用到的库和知识点(针对Vue框架)常用的配置项:基本:模式:默认'development','production',针对不同的模式,webpack会使用不同的打包时的插件和打包行为,我们也可以根据不同的打包方式自定义使用哪些插件或加载器。context:每个配置项路径的上下文,context默认值为CWD。建议将context切换到项目根目录,这样可以使项目配置独立于CWD输出:filename:打包chunk的文件名形式,一般涉及代码切分,多插件,多-入口和多束。[name],一般为[name].bundle.js或[name].jspublicPath:请求资源时的路径resolve:extensions(Array):对于某些扩展类型,可以不加后缀别名来引用(Object):路径别名开发模式:devtool:sourceMap方法devServer:hot:热更新proxy:proxyopen:打包后自动打开页面quiet:true,//FriendlyErrorsPlugin生产模式必备:optimization.splitChunks:用于chunk打包和chunking配置,为不同文件夹下的模块生成不同的chunk。常用库:开发必备的webpack-dev-server,webpack内置,通过devServer配置调整--inline:启用内联模式,构建消息会显示在浏览器控制台,socket.io客户端代码被打包在里面,so如通过websocket与webpack-dev-server通信,实现自动编译打包,自动页面刷新功能(默认为inline)--iframe:对应inline模式,构建消息显示在其中一个页面的iframe元素中--quiet:不显示打包信息--compress:启用gzip压缩--progress:显示打包进度合并会有很好的效果。rimraf可以用来删除之前的打包文件。ora可以用来在打包过程中在终端显示旋转圆圈,表示正在打包。同时还可以设置字体颜色。chalk可以对终端打印出来的文字进行样式修改,比如修改颜色等。portfinder端口设置可以使用自动设置端口,不再重复。这个库是在开发模式下搭建vue-cli时用到的。详见:https://zhuanlan.zhihu.com/p/...modules:base:eslint-loader(即将废弃,迁移到EslintWebpackPlugin)babel-loader:优化相关:use:'babel-loader?cacheDirectory=true'开启缓存Configuration:"stage-2":支持stage-2的语法标准env:modules:false表示不将esmodule转为commonjs,默认为true,如果为true,webpack的tree-shaking将无效{"presets":[["env",{“modules”:false,“targets”:{“browsers”:[">1%","last2versions","notie<=8"]}}],"stage-2"],"plugins":["transform-vue-jsx","transform-runtime"],"env":{"development":{"plugins":["dynamic-import-node"]}}}url-loader将大小在一定范围以下的各种媒体文件转换为dataURL,以避免过多的http请求注意:v5后已弃用,请考虑改用资产模块svg-sprite-loader用于处理icon图标,生成sprite图片。一方面可以减少http请求,另一方面可以使用简单引入图标vue-loader(注意使用这个loader需要加上对应的vue-loader-plugin)json5-loader(将json转为js对象)style-related:(style-,MiniCssExtractPlugin.loader,vue-style-),css-,postcss-,less-,sass-,stylus-(注意顺序,从右到左,加粗部分是随机的)注:style-loader、MiniCssExtractPlugin.loader、vue-style-loader的区别1MiniCssExtractPlugin.loader多用于生产模式获取单独的css文件,而style-loader多用于生产模式开发模式因为在dom中注入多个css,速度更快,vue-style-loader是基于style-loader,支持vuessr2MiniCssExtractPlugin.loader和style-loader冲突3有htmlWebpackPlungin的时候,可以忽略style-loader插件,它将注入MiniCssExtractPlugin提取的文件。)在一些性能开销大的加载器前添加cache-loader,将结果缓存到磁盘,效果相当不错。1关于babel-loader优化:babel本身也可以通过缓存来优化,所以效果差不多的时候还是用自带的比较好2关于vue-loader优化:vue-loader官方有提到关于cache-loader的使用,但没有提及具体的使用细节。具体如下:{test:/\.vue$/,loader:'vue-loader',exclude:/node_modules/,include:resolve('src'),options:{cacheDirectory:resolve('./cache-loader'),//缓存cacheIdentifier:'cache-loader:{version}{process.env.NODE_ENV}'}},{test:/\.js$/,use:[{loader:'cache-loader',options:{cacheDirectory:resolve('cache-loader'),//cache}}],exclude:/node_modules/,include:resolve('src')}thread-loader(tryitout)对于大型项目和许多文件这个加载器可以用于多进程打包。exports-loader可以导出所有可访问的变量,主要用于处理旧库api无法模块化引入。plugins:DefinePlugin:允许定义全局常量HotModuleReplacementPlugin(HRM):1当你更新代码时,webpack会监听并自动刷新浏览器。但是这样一来,你之前的一些操作记录就会丢失。为了不丢失原来的操作,改一下页面显示,使用HMR2生产模式下永远不要开启HRM3开发模式下,可以直接通过hot控制hot模块的切换friendly-errors-webpack-plugin:识别某些类别的webpack错误,并清理,聚合和优先级以提供更好的开发者体验HtmlWebpackPlugin:在打包过程中将生成的bundle引入到指定的script标签中的html文件中,包括css提取插件提取的css文件详见:https://github.com/jantimon/h...SplitChunksPlugin(webpack内置):(很重要,相当于optimization.splitChunks)从v4开始,CommonsChunkPlugin被移除,取而代之的是SplitChunksPlugin1核心属性cacheGroup,其他属性围绕该属性配置的group生效。按组拆分合并。合理划分公共模块,划分如下:库和工具-libs自定义ui库和工具-vendor低频库/工具/代码-chunk业务模块-entry2但注意cacheGroup会冲突与MinChunkSizePlugin插件,如果两者都配置,则MinChunkSizePlugin优先。HashedModuleIdsPlugin和NamedChunkPlugin:(重要)模块和块:模块是指将代码按照功能拆分,分解成离散的功能块。拆分后的代码块称为模块。可以简单理解为一个导出/导入就是一个模块。chunk是指代码中引用的文件(如:js、css、图片等)会根据配置组合成一个或多个包。我们称一个包为chunk。HashedModuleIdsPlugin每次打包时,有时我们会发现即使内容没有改变,打包后的文件对应的hash还是变了。这是因为webpack内部维护了一个自增的id,每个模块都有一个id。因此,当添加或删除一个模块时,id会发生变化,导致其他文件不变,但由于id被接管了,只能递增或递减,导致整个id的顺序乱了.所以即使有些package对应的code没有变,但是分配的id变了,所以最终生成的package的内容也变了,导致chunkhash发生了变化。HashedModuleIdsPlugin的原理是根据生成moduleId在文件的相对路径上,默认为4位数字。当然你也可以自己设置长度等一些配置。这样就避免了上述情况。注:NamedModulesPlugin和HashedModuleIdsPlugin的原理是一样的。使用文件路径作为id,但路径不做hash,适合开发环境方便调试。生产环境不建议配置,因为它不仅会增加文件大小(路径一般较长,偶尔阅读),更重要的是,它会暴露你的文件路径。NamedChunkPlugin同样,chunkid也需要单独处理,需要添加相应的插件,但是插件比较可怜,因为懒加载无效。好在插件可以传入一个函数newwebpack.NamedChunksPlugin(chunk=>{if(chunk.name){returnchunk.name}constmodules=Array.from(chunk.modulesIterable)if(modules.length>1){consthash=require('hash-sum')constjoinedHash=hash(modules.map(m=>m.id).join('_'))letlen=nameLengthwhile(seen.has(joinedHash.substr(0,len)))len++seen.add(joinedHash.substr(0,len))return`chunk-${joinedHash.substr(0,len)}`}else{returnmodules[0].id}})v5版本处理:v5版本自然不会忽略这个问题,早在2015年就开始存在这个问题,并且讨论了很久。v5版本将上述配置简化为以下情况:默认情况下是这样的:v5模块和chunk命名:在开发模式下,默认启用的新命名代码块ID算法为模块提供人类可读的名称.模块ID由其相对于上下文的路径确定。代码块ID由代码块的内容决定。所以你不再需要使用import(/*webpackChunkName:"name"*/"module")来调试。但如果你想在生产中控制文件名,它仍然有意义。您可以在生产中使用chunkIds:"named",但请确保您不会意外暴露有关模块名称的敏感信息。TerserWebpackPlugin:(v5使用7以下的版本)(v4使用5^4.2.3以下的版本)这个插件使用terser来压缩js。推荐使用terser而不是uglify插件,主要是uglify对es6及以上版本支持不足。有很多bug没有维护,所以不适合使用MiniCssExtractPlugin:用于将css分离成文件,需要配合MiniCssExtractPlugin.loader使用注意:关于MiniCssExtractPlugin和extract-text-webpack-plugin,两者都是将css提取到文件中,官方已经声明extract-text-webpack-plugin插件不支持v4版本的webpack,所以如果v4需要提取css,请使用MiniCssExtractPlugincompressionwebpackplugin:(v4使用的是一个版本below7)目前,与gzip压缩相比,有更好的Zopfli压缩,同样兼容gzip格式,但损耗更低,速度更快。还有一种叫brotilcompression,但是目前这种模式在server端不太好实现,要求node版本在11以上注意:开启压缩会对打包时间有影响CssMinimizerWebpackPlugin:下面2)1这个插件使用cssnano来优化和压缩CSS2就像optimize-css-assets-webpack-plugin,但是在sourcemaps和assets中使用查询字符串会更准确,支持缓存并以并发模式运行EslintWebpackPlugin:从eslint-loader迁移,eslint-loader将很快被弃用。相对于eslint-loader,这个插件:1更容易配置2生成独特的输出报告3直接从eslint使用缓存4只对修改的文件进行lint检查ImageMinimizerWebpackPlugin(试一试)图片压缩插件PrefetchPlugin预加载常用模块请求(模块请求)允许这些模块在被导入或需要之前被解析和编译。speed-measure-webpack-plugin:(可选)模块打包时间分析,使用该插件会显示打包后每个包所花费的时间。BundleAnalyzerPlugin:(可选)模块包大小分析。使用这个插件后会弹出一个页面,分析每个bundle和每个module的空间比例。EvalSourceMapDevToolPlugin/sourceMapDevToolPlugin:(可选)1提供对sourceMap源映射更细粒度的控制2可以直接使用SourceMapDevToolPlugin/EvalSourceMapDevToolPlugin,而不是使用devtool选项,因为它有更多选项。I18nWebpackPlugin:(可选)此插件将在包生成期间执行文本翻译,因此您可以将翻译后的包直接交付给用户。LimitChunkCountPlugin(optional,try)限制包文件的最大数量,现在不再支持最小包文件限制功能,如果需要,使用MinChunkSizePluginMinChunkSizePlugin(optional,try)使每个包文件至少在一定大小以上(推荐50kb或more:50000),但是使用这个插件会和splitChunk冲突导致splitChunk文件失效。NormalModuleReplacementPlugin(optional)允许在构建过程中替换匹配的文件,可以根据不同的行为进行替换NpmInstallWebpackPlugin(optional)自动安装用户不需要关心的npm包,可以在工作时自动安装那些缺失的包需要并导入。开发方式推荐StylelintWebpackPlugin(可选,可以试试)webpack官方提供的Stylelint插件ProgressPlugin(观察,可以尝试):暴露webpack打包构建进度插件ProvidePlugin(可选)自动加载配置好的模块而不导入或要求它全局使用模块。插件还支持导出模块的一些API,可以很好的利用treeshaking。dllPlugin这个插件的作用是介绍后续插件的两个dll插件,就是缓存,空间换时间。但是插件配置比较繁琐,所以推荐使用AutoDllPlugin,但其实webpack4的性能已经足够好了,比如vue和react都去掉了dll插件,所以要不要用就看个人了。值得一提的插件是hard-source-webpack-plugin,它比dll有性能优势,配置方便,但目前只有webpack5支持。