vlambda博客
学习文章列表

Webpack基本打包配置及打包静态资源

1.打包css、html、图片资源     开发环境
//resolve 用来拼接绝对路径的方法
const { resolve } = require('path');
//用于打包html资源   为构造函数
const HtmlWebpackPlugin = require('html-webpack-plugin');

moudle.exports = {
 //webpack配置
 //入口起点
 entry:'./src/index.js',
 //输出
 output:{
   //输出文件名
   filename:'built.js',
   //输出路径
   //_dirname node.js的变量,代表当前文件的目录绝对路径
},
 //loader的配置   例如打包样式资源
 moudle:{
   rules:[
       //详细loader配置
       //不同文件必须配置不同loader
      {
        //匹配哪些文件
        test:/\.css$/,
        //使用哪些loader进行处理 执行顺序:从右到左、从下到上
        use:[
           //创建style标签,将js中的样式资源添加到head中生效
           'style-loader',
           //将css文件变成commonjs模块加入到js中,里面内容是样式字符串。
           'css-loader'
        ]
      },
      {
           test:/\.less$/,
           use:[
               'style-loader',
               'css-loader',
               //将less文件编译成css文件   需要下载less-loader和less
               'less-loader'
          ]
      },
       //处理图片资源 处理css中的图片   但默认处理不了html中引入的图片
      {
           test:/\.(jpg|png|gif)$/,
           //使用一个loader   需下载url-loader file-loader
           loader:'url-loader',    一个用loader   多个可以用use
           options:{
               //根据情况配置
               //当发现图片大小小于8kb,就会被base64处理
               //base64优点:减少请求数量,减轻服务器压力
               //缺点:图片体积会更大(文件请求速度更慢)
               limit:8*1024,
//问题:url-loader默认使用es6模块化解析,而html-loader引入图片是commonjs
               //解析时就会出问题,[object Module]
               //解决:关闭url-loader的es6模块化,使用commonjs解析
               esMoudle:false
          }
      },
      {
           test:/\.html$/,
           //处理html文件的imd图片(负责引入imd,从而能被url-loader进行处理)
           loader:'html-loader'     //解析会报错   原因如上
      }
  ]
},  
 //plugins的配置 例如打包html资源
 plugins:[
   //详细plugins的配置
   //html-webpack-plugin
   new HtmlWebpackPlugin({
       //复制'./src/index.html'文件,并自动引入打包输出的所有资源(js/css)
       template:'./src/index.html'
  })  
],
 //模式
 mode = 'development'
 //mode = 'production'
}
2.打包其他资源,字体图标等
const { resolve } require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
moudle.export={
   entry:'./src/index.js',
   output:{
       filename:'built.js',
       path:resolve(_dirname,'build')
  },
   moudle:{
       rules:[
          {
               test:/\.css$/,
               use:['style-loader','css-loader']
          },
           //打包其他资源(除css/js/html资源以外的其他资源
          {
               //排除css/js/html资源
               exclude:/\.(css|js|html)$/,
               loader:'file-loader'
          }
      ]
  },
   plugins:[
       new HtmlWebpackPlugin({
          template:'./src/index.html'
      })
  ],
   mode = 'development'
}
3.devServer

开发服务器devServer:用来自动化(自动编译、自动打开浏览器、自动刷新浏览器)

特点:只会在内存中编译打包,不会有任何输出   启动指令为:npx webpack-dev-server

devServer:{
  contentBase:resolve(_dirname,'build'),
  //启动gzip压缩
  compress:true,
  //端口号
  port:3000,
  //自动打开浏览器
  open:true    
}
4.提取css为单独文件        生产环境

①使用插件   new MiniCssExtractPlugin()     提取js中的css为单独文件

②使用MiniCssExtractPlugin.loader    此时可去掉style-loader

{
   test:/\.css$/,
   use:[
       //创建style标签,将js中的样式资源添加到head中生效
       //'style-loader',
       //这个loader取代style-loader。作用:提取js中的css为单独文件
        MiniCssExtractPlugin.loader,
       //将css文件编译到js文件中
       'css-loader',
       //css兼容性处理:postcss--->postcss-loader   postcss-perset-env
       //帮postcss找到package.json中的browserslist里面的配置,通过配置加载指定的css兼容性样式
       //设置开发环境 node环境变量   process.env.NODE_ENV = 'development';
       //例如         "browserslist":{           基本兼容全部浏览器
                          "development":[
                              "last 1 chrome version",
                              "last 1 firefox version",
                              "last 1 safari version",
                          ],  
         //默认看是生产环境
                           "production":[
                               ">0.2%",
                               "not dead",
                               "not op_mini all"
                          ]
                      }
       //使用loader的默认配置
       //'postcss-loader'  
       //修改loader的配置
      {
           loader:'postcss-loader',
           options:{
               ident:'postcss',
               plugins:() => [
                   //postcss的插件
                   require('postcss-perset-env')
              ]
          }
      }
  ]    
}
.......
plugins:[
   new HtmlWebpackPlugin({
       template:'./src/index.html'
  }),
   new MiniCssExtractPlugin({
       //对输出的css文件进行重命名
       filename:'css/built.css'
  })
]
5.压缩css     用插件   optimize-css-assets-webpack-plugin
const OptimizeCssAssetsWebpackPlugin =require('optimize-css-assets-webpack-plugin')
plugins:[
 .......
 //压缩css
 new OptimizeCssAssetsWebpackPlugin()
]
6.js语法检查eslint   以及js兼容性处理eslint
moudle:{
   rules:[
       /*语法检查:elsint-loader eslint
      注意:只检查自己写的源代码 第三方库是不用检查的
      设置检查规则:package.json中的eslintConfig中设置~*
      arbnb --> eslint-config-airbnb-base   eslint-plugin-import   eslint*/
      {
           test:/\.js$/,
           exclude:/node_modules/,
           loader:'eslint-loader',
           options:{}
      },
       /*js兼容性处理(将es6以上的语法转化为es6以下的) babel-loader @babel/core        
          1.只能转换基本语法 @babel/presets-env  
          2.转换全部语法   全部js兼容性处理 --> @babel/polyfill(只需在js中引入)
            缺点:将所有对兼容性代码的处理全部引进来了 增加了代码的体积
          3.需要做兼容性处理的就做:按需加载 ---》 core-js */
      {
         test:/\.js$/,
         exclude:/node_modules/,  
         loader:'babel-loader',
         options:{
             //提示babel做怎样的兼容性处理
             presets:[
                 '@babel/presets-env',
                {
                     //按需加载
                     useBuiltIns:'usage',
                     //指定corejs版本
                     corejs:{
                         version:3
                    },
                     //指定兼容性做到哪个版本的浏览器
                     targets:{
                         chrome:'60',
                         firefox:'60',
                         ie:'9',
                         ......
                    }
                }
            ]
        }  
      }    
  ]
}
package.json中
"eslintConfig":{
   "extend":"airbnb-base"   //继承airbnb-base规则检查
}
7.html和js的压缩
//生产环境下会自动压缩代码,不需要管
//压缩html
plugins:[
   new HtmlWebpackPlugin({
       template:'./src/index.html',
       minify:{
           //移除空格
           collapsewhitespace:true,
           //移除注释
           removeComments:true
      }
  }),
]
8.性能优化
1.开发环境性能优化

①优化打包构建速度

②优化代码调试

2.生产环境性能优化

①优化打包构建速度

②优化代码运行性能