zoukankan      html  css  js  c++  java
  • webpack构建优化

    webpack性能优化:

    • 优化开发体验
    • 优化输出质量

    优化开发体验:

    • 提升效率
    • 优化构建速度‘
    • 优化使用体验

    优化输出质量:

    • 优化要发布到线上的代码,减少用户能感知到的加载时间
    • 提升代码性能,性能好,执行越快

    缩小文件范围:

     优化loader配置:test、include、exclude三个配置项来缩小loader的处理范围,推荐include(webpack5.x此属性应该是去掉了,4.x推荐使用一下),减小搜索范围,提升构建速度

    {
              test:/.css$/,
              include:path.resolve(__dirname,"./src"),//没指定这个字段,他会在整个项目中搜索检查css格式的文件再使用对应loader执行,比较消耗时间,此属性指定搜索范围,只在此目录下搜索 
              //exclude:path.resolve(__dirname,"./node_modules"),//排除,不要搜索那个目录
              use:["style-loader","css-loader"],
    },

     优化resolve.modules配置:他用于配置webpack去哪些目录下寻找第三方模块,默认是node_modules;寻找第三方模块,默认是当前目录下的node_modules里面找, 没有的话就去上一级目录../node_modules找,再没有会去../../node_modules里找

     优化resolve.alias配置通过别名来将原导入路径映射成一个新的导入路径

     优化resolve.extensions配置:再导入语句没带文件后缀时,webpack会自动带上后缀厚,去尝试查找文件是否存在(后缀尝试列表尽量的小;导入语句尽量的带上后缀)

    module.exports = {
      resolve:{
           modules:[path.resolve(__dirname,"./node_modules")],//如果我们的第三方模块都安装在项目根目录下,就可以直接指明这个路径
         alias:{ //通过别名将原导入路径映射成新路径
          "@":path.join(__dirname,"./pages")
         },
             extensions:["js","json"],//引入模块可以不加后缀
        }  
    }

      使用静态资源路径publicPath(CDN):把所有输出文件路径之前都自动补上这个路径

      CND通过将资源部署到世界各地,使得用户可以就近访问资源,加快访问速度,要接入CDN,需要把网页的静态资源上传到CDN服务上,在访问这些资源时,使用CDN服务提供的URL

    • 公司得有cdn服务器地址
    • 确保静态资源文件的上传与否  
    output:{
            path:path.resolve(__dirname,"./dist"),
            filename:"[name]_[hash:6].js",
            publicPath:"http://cdn.com/assets",//配合cdn服务器使用,所有输出文件前面自动补上这个路径
        },

    CSS文件的处理:优化开发体验,提高开发效率

    • 使用less或者sass当做css技术栈:

          安装:npm install lese less-loader --save-dev

    • 使用postcss为样式自动补齐浏览器前缀

       比如css样式中有display:flex;会自动补全所有兼容版本的此属性eg: ms   webkit

              安装:npm i postcss-loader autoprefixer -D

              ##新建postcss.config.js

    ##postcss.config.js
    module.exports = { plugins:[ require("autoprefixer")({ overrideBrowserslist:["last 2 version", ">1%"]//指定补全的浏览器:last 2 version当前主流浏览器最近两个版本;>1%浏览器的市场份额要大于1% }) ] }
    ##webpack.config.js
    { test:
    /.less$/, include:path.resolve(__dirname,"./src"), use:["style-loader","css-loader","postcss-loader","less-loader"] }

     借助MiniCssExtractPlugin完成抽离css:

    npm install mini-css-extract-plugin -D
    
    const MiniCssExtractPlugin = require("mini-css-extract-plugin")
    
     {
                    test:/.less$/,
                    use:[MiniCssExtractPlugin.loader,,"css-loader","postcss-loader","less-loader"]
    }
    
    plugins:[
        new MiniCssExtractPlugin({//抽离css为独立文件输出
                filename:'css/[name]_[contenthash:6].css',
                chunkFilename:"[id].css"
         })
    ]

     压缩css:借助optimize-css-assets-webpack-plugin;借助cssnano (压缩规范)

    ##安装:npm install cssnano -D ;  npm i optimize-css-assets-webpack-plugin -D;

    const OptimizeCSSAssetsPlugin = require("optimize-css-assets-webpack-plugin")
    
    plugins:[
            new OptimizeCSSAssetsPlugin({
                cssProcessor:require("cssnano"),//引入cssnano配置压缩选项   压缩项
                cssProcessorOptions:{                                  //压缩配置
                    discardComments:{ removeAll: true }
                }
            })
    ]        

    压缩html:借助html-webpack-plugin

    ##安装
    
    const htmlWebpackPlugin = require("html-webpack-plugin");
    
    new htmlWebpackPlugin({
                title:"首页",
                template:"./src/index.html",
                filename:"index.html",            
                minify:{
                    removeComments:true,//移除html中的注释
                    collapseWhitespace:true,//删除空白符与换行符
                    minifyCSS: true  //压缩内联css
                }
     }),

    优化文件监听的性能:

    在开启监听模式时,默认情况下会监听配置的entry文件和所有entry递归依赖的文件,在这些文件中会有很多存在于node_modules下,因此如今的web项目会依赖大量的第三方模块,所以在大多数情况下我们都不可能去编辑node_modules下的文件,而是编辑自己建立的源码文件 ,而一个很大的优化点就是忽略node_modules下的文件,不监听他们

    module.export = {
        watchOptions:{
             //不监听node_modules目录下的文件
             ignored:/node_modules/
        }      
    }
    采用这种方法优化后,webpack消耗的内存和CPU将会大大减少

    development vs production模式区分打包

    安装:npm install webpack-merge -D

    环境变量的方式

    tree-shaking:清楚无用的css,js(dead code

    安装:npm i glob-all purify-css purifycss-webpack --save-dev

    const PurifyCSS = require("purifycss-webpack")
    const glob = require("glob-all")
    new PurifyCSS({
                paths:glob.sync([
                    //要做css Tree Shaking 的路径文件
                    path.resolve(__dirname,"./src/*.html"),//请注意,我们同样需要对html文件进行tree shaking
                    path.resolve(__dirname,"./src/*.js")
                ])
    })

    js tree shaking:只支持import方式引入,不支持commonjs的方式引入

    module.exports = {
        optimization:{
            usedExports:true,//哪些导出的模块被使用了,再做打包
        },
    }

    只支持import方式引入,不支持commonjs的方式引入

    只要mode是production就会生效,development的tree shaking是不会生效的,因为webpack为了方便你的调试,可以查看打包后的代码注释以辨别是否生效

    可以查看打包后的代码注释以辨别是否生效----没用到的方法会告诉你只用到了哪个方法

    案例
    //expo.js
    export const add = (a,b) => {
        return a + b
    }
    
    export const minus = (a,b) => {
        return a - b
    }
    
    index.js
    import {add} from './expo.js'
      import css from "./index.less
    add(1,2)

     副作用:如果你js文件里引入了less或者图片等文件,但是文件里却没有用到,就会被摇掉,随意导致样式不生效 ---上面代码

    解决://package.json

    "sideEffects":false,//正常对所有模块进行tree shaking,仅生成模式有效,需配合usedExports

    或者在数组里面排除不需要tree shaking的模块

    "sideEffects":["*.css","*.png"]

     代码分割 code splitting

  • 相关阅读:
    【pytest】(六) pytest中fixture的使用
    【pytest】(七) pytest的一些你爱不释手的插件
    【pytest】(五) pytest中的断言
    【pytest】(四) pytest的一些其他的运行用法
    本两周学习总结
    本两周学习总结
    本两周总结
    本两周学习总结
    本周学习总结(原生)
    本周学习总结(原生)
  • 原文地址:https://www.cnblogs.com/znLam/p/13028287.html
Copyright © 2011-2022 走看看