treeShaking,mode,codeSplitting,SplitChunksPlugin,Lazy Loading,chunk,Preloading, Prefetching,代码分割,Shi

c分清到底是plugin还是loader

**treeShaking 只支持ESModule

一个模块中没用到的

// mode: "dev"默认没有treeShaking ,因此即使使用treeShaking ,也不会去掉模块,只是在代码标记;方便调试错误
// 用到的才导出
  optimization: {
    usedExports: true
  },
// package.json中
  "sideEffects": ['@babel/polly-fill','*.css'],
  "sideEffects": false,// 对所有模块treeShaking 
对于'@babel/polly-fill' 该模块不会导出,只是在window.Promise;treeShaking 会将此模块忽略
**mode
// An highlighted block
  "scripts": {
    "dev": "webpack-dev-server --config ./build/webpack.dev.js",
    "build": "webpack --config ./build/webpack.prod.js"
  },
//webpack.common.js
//npm i webpack-merge -D
//webpack.dev.js
const merge = require('webpack-merge')
const config = require('./webpack.common')
module.exports = merge(config,devConfig)
//webpack.prod.js
const merge = require('webpack-merge')
const config = require('./webpack.prod')
module.exports = merge(config,prodConfig)
**codeSplitting

bundle analysis
CleanWebpackPlugin默认build目录是根目录

// An highlighted block
var foo = 'bar';
**SplitChunksPlugin
// 手动将main.js拆成库代码和业务代码
  entry: {
    'lodash': './src/lodash.js',
    'main':  './src/test.js'
  },
 //webpack自带codeSplitting插件,同步载入模块
  optimization: {
    splitChunks: {
      chunks: 'all'
  }
}
// 异步载入模块不需要配置 ,但打包的文件名是vendors~lodash.js
function getComponent() {
// magic tree语法+
  return import(/*webpackChunkName:"lodash"*/'lodash').then(({default:_})=>{
    var div = document.createElement('div')
    div.innerHTML = _.join(['c','jj'],'**')
    return div
  })
}
getComponent().then(ele=>{
  document.body.appendChild(ele) 
})
//异步载入模块配置后,打包的文件名是lodash.js
  optimization: {
    splitChunks: {
      chunks: 'all',
      cacheGroups: {
        vendors:false
        default: false
      }
   
    }
  },
// 其他配置项,默认配置
  optimization: {
    splitChunks: {
      chunks: 'async', // chunks: 'all',
      minSize: 30000,//引入的库作代码分割的条件
      maxSize: 0, // 对分割后代码块继续分割
      minChunks: 1,//对代码至少使用多少次进行代码分割//感觉对异步模块载入没效?????
      maxAsyncRequests: 5,//同时只能加载5个请求,打包前5个库时,生成js文件,超过5个,不会进行代码分割??
      maxInitialRequests: 3,//入口文件引入的js代码分割时,最多分割成3个
      automaticNameDelimiter: '~',//
      automaticNameMaxLength: 30,
      name: true,
      //确定分割出来的group要放在哪个文件中
      cacheGroups: {//同步载入模块时vendors和default也要配制,vendors~main.js
        vendors: {
          test: /[\\/]node_modules[\\/]/,
          priority: -10,
         // name: 'vendors'
        //  filename: '[name].bundle.js' 
        },
        default: {
          priority: -20,
          reuseExistingChunk: true,//如果之前打包过,直接使用,不在重复打包
          filename: 'default.js'
        }
      }
    }
 }
      
**Lazy Loading
// An highlighted block
// function getComponent() {
//   return import(/*webpackChunkName:"lodash"*/'lodash').then(({default:_})=>{
//     var div = document.createElement('div')
//     div.innerHTML = _.join(['c','jj'],'**')
//     return div
//   })
// }

async function getComponent() {
  const {default:_} = await import(/*webpackChunkName:"lodash"*/'lodash')
  var div = document.createElement('div')
  div.innerHTML = _.join(['c','jj'],'**')
  return div
}

document.addEventListener('click',()=>{
  // import异步加载,懒加载是es引入的概念;需要某些模块的时候,再去请求
  getComponent().then(ele=>{
    document.body.appendChild(ele) 
  })
})
**chunk
// An highlighted block
Asset       Size  Chunks                 Chunk Names
index.html  355 bytes          [emitted]
 lodash.js   70.2 KiB       0  [emitted]  lodash
   main.js   2.46 KiB       1  [emitted]  main
**Preloading

访问首页时不需要加载" 登陆 "的代码


// An highlighted block
让代码覆盖率高,使用异步加载,用到时才加载,提高性能
  import (/* webpackPrefetch: true */'./click.js').then(({default : _})=>{
    _()
  })
**Prefetching(可能存在浏览器兼容)
// An highlighted block
var foo = 'bar';
main.js走filename,而main.js依赖的文件走chunkFilename配置
  output: {
    // publicPath: '/',
    filename: '[name].js',
    chunkFilename: '[name].chunk.js',
    // __dirname指webpack.config.js所在的目录
    path: path.resolve(__dirname,'../dist')
  }
**mini-css-extract-plugin(css代码分割)???dev下的样式经常有问题==(已解决)==因为使用tree shinking时package.json里面sideEffects中配置的是false,将没有导出的文件全部删除掉
1. npm安装
2. require && loader里替换 && plugin中声明
3. 注意tree shinking
// npm install --save-dev mini-css-extract-plugin
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
  module: {
    rules: [
      {
        test: /\.scss$/,
        use: [MiniCssExtractPlugin.loader,'css-loader','sass-loader']
      },
      {
        test: /\.css$/,
        use: [MiniCssExtractPlugin.loader,'css-loader']
      },
    ]
  },
  plugins: [
    new MiniCssExtractPlugin({
          filename: '[name].css', //html会将css以link形式引入
      chunkFilename: '[name].[hash].css',
})
  ],

// npm i optimize-css-assets-webpack-plugin -D
// css代码的压缩和合并
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
  optimization: {
    minimizer: [ new OptimizeCSSAssetsPlugin({})],
  },
//const MiniCssExtractPlugin = require('mini-css-extract-plugin');
多个入口文件分别引入的css强行打包到一个css styles文件中
module.exports = {
  optimization: {
    splitChunks: {
      cacheGroups: {
        styles: {
          name: 'styles',
          test: /\.css$/,
          chunks: 'all',
          enforce: true, //不管min和maxSize
        },
      },
    },
  },
多个入口文件分别引入的css打包到不同css文件中
**缓存
performance: false, //不让提示性能上问题
// An highlighted block
 filename: '[name].[contentHash].js',
 chunkFilename: '[name].[contentHash].js',

 老版本的webpack,文件并未改变两次打包的hash名也可能一样,因此需要在
 optimization: {
	runtimeChunk: {
		name: 'runtime' //runtime.js存在mainfest,业务代码和库代码之间映射关系
	}
}
**Shimming (改变一些特性)
// An highlighted block
const webpack = require('webpack')

plugins:[
  new webpack.ProvidePlugin({
    $: 'jquery' //模块中用了$,会自动引入jquery库
  })
]

export function ui(){
  $('body').css('background',_join(['blue'],''))
}
  new webpack.ProvidePlugin({
    $: 'jquery' ,//模块中用了$,会自动引入jquery库
    _join: ['lodash','join']
  })
  
每个模块的this指向window
//npm i imports-loader -D
module: {
    rules: [

    { test: /\.js$/, 
      exclude: /node_modules/, 
      use: [
        {
          loader: "babel-loader"
        },
        {
          loader: "imports-loader?this=>window"
        }
      ],
// 环境变量的使用方法
  "scripts": {
    "dev-build": "webpack --config ./build/webpack.common.js",
    "dev": "webpack-dev-server --config ./build/webpack.common.js",
    "build": "webpack --env.production --config ./build/webpack.common.js"
 //    "build": "webpack --env production --config ./build/webpack.common.js"
  },
const merge = require('webpack-merge')
const devConfig = require('./webpack.dev')
const prodConfig = require('./webpack.prod')

module.exports = (env)=>{       //module.exports = (production)=>{  
  if(env && env.production){   //  if(production){ 
    return merge(config,devConfig)
  }else{
    return merge(config,prodConfig)
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值