前端性能优化三十七:花裤衩模板路由懒加载

(1). 目的:

1. 让包不需要一次把所有的页面的加载进来,只加载当前页面的路由组件即可.

(2). 3种引入方式:

export default new Router({
  routes: [
    {
      path: '/',
      name: "index",
      // 1. 普通引用
      component: index
      // 2. 路由懒加载
      component: resolve => require(['@/views/index.vue'], resolve)
      // 3. 路由懒加载,并且命名chunk名字,结合webpack的import使用
      component: () => import(/* webpackChunkName: 'index' */ '@/views/index.vue') 
    }
  ]
})

(3). 移除prefetch、Preload:

. prefetch、Preload的作用:
    a. 当首屏加载时,会一次性下载完所有的路由文件,导致首屏请求内容很多,首屏加载变慢.
    b. 当访问路由时再去加载该模块,把静态引入方式改为动态引入方式.. 在vue cli3中,需要手动移除这两个.. 举例:
    module.exports = {
      chainWebpack: config => {
        // 移除 prefetch 插件
        config.plugins.delete('prefetch')
        // 移除 preload 插件
        config.plugins.delete('preload');
      }
    }

scss文件引入

我们通常会把scss文件抽离出来,一些共用样式,主题等,然后会在每个需要的组件中引入会显得繁琐,我们可以借助scss-loader进行预处理

例如我们有 resetTable.scss 文件,可以在vue.config.js中引入

module.exports = {
 chainWebpack: config => {
  config
  .plugin('webpack-bundle-analyzer')
  .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
  config.plugin('html').tap(args => {
   if (process.env.NODE_ENV === 'production') {
   args[0].cdn = cdn
   }
   return args
  })
  // 移除 prefetch 插件
  config.plugins.delete('prefetch')
  // 移除 preload 插件
  config.plugins.delete('preload');
  },
 configureWebpack: config => {
  if (process.env.NODE_ENV === 'production') {
   return {
   externals: externals,
   plugins: [
    //gzip压缩
    new CompressionPlugin({
    test: /\.js∣¨E92E.html|\.html∣¨E92E.html|.\css/, //匹配文件名
    threshold: 10240, //对超过10k的数据压缩
    deleteOriginalAssets: false //不删除源文件
    })
   ],
   performance: {
    hints: false
   }
  };
  }
 },
 // scss设置
 css: {
  loaderOptions: {
  sass: {
   //我是放在 assets/commcss 目录下
   data: '@import "@assets/commcss/resetTable.scss";'
  }
  },
 },
}

使用uglifyjs-webpack-plugin插件代替webpack自带UglifyJsPlugin插件
两个插件都不支持es6压缩,所以使用此插件前需要用工具(如babel-loader)转换es6代码

问题描述:项目中使用iview时,导致使用UglifyJsPlugin压缩报错
因为iview某插件中包含es6语法。然而两个插件都不支持es6压缩
解决方法如下:

修改webpack配置文件,使用babel-loader转换一下iview插件中的es6语法

module.exports = {
  entry: {
    app: './src/main.js'
  },
  output: {
    path: config.build.assetsRoot,
    filename: '[name].js',
    publicPath: process.env.NODE_ENV === 'production'
      ? config.build.assetsPublicPath
      : config.dev.assetsPublicPath
  },
...
  module: {
    loaders: [
      { test: /iview.src.*?js$/, loader: 'babel' },
      { test: /\.js$/, loader: 'babel', exclude: /node_modules/ }
    ],
    rules: [
    ...
      {
        test: /\.js$/,
        loader: 'babel-loader',
         // resolve('/node_modules/iview/src'),resolve('/node_modules/iview/packages')解决iview打包时UglifyJs报错
        include: [resolve('src'), resolve('test'), resolve('/node_modules/iview/src'),resolve('/node_modules/iview/packages')]
      }
      ...
    ]
  }
}
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
...
    new UglifyJsPlugin({
      // 使用外部引入的新版本的js压缩工具
      parallel: true,
      uglifyOptions: {
        ie8: false, // 启用IE8支持
        ecma: 6, // 支持的ECMAScript的版本(5,6,7或8)。影响parse,compress&& output选项
        warnings: false, // 显示警告
        mangle: true, // debug false
        output: {
          comments: false,
          beautify: false, // debug true
        },
        compress: {
          // 在UglifyJs删除没有用到的代码时不输出警告
          warnings: false,
          // 删除所有的 `console` 语句
          // 还可以兼容ie浏览器
          drop_console: true,
          // 内嵌定义了但是只用到一次的变量
          collapse_vars: true,
          // 提取出出现多次但是没有定义成变量去引用的静态值
          reduce_vars: true,
        }
      }
    }),
    // new webpack.optimize.UglifyJsPlugin({
    //   compress: {
    //     warnings: false
    //   },
    //   sourceMap: true
    // }),
    ```

你可能感兴趣的:(前端,性能优化,自动化,webpack,系统架构,vue.js,前端框架)