vue-cli3配合nignx服务器,实现项目访问提升

191 阅读3分钟

公司的项目是以小程序为空壳,通过小程序原生web-url组件进行页面请求访问,每一次通过服务器build打包后,会造成小程序跳转H5的页面过程中,出现非常大的空白页面等待时间。

针对项目进行了一下优化

1、将一些第三方插件以及vue相关的全家桶采用cdn的形式进行引用

公司项目存在echartsvue全家桶等插件,配置到cdn

// vue.config.js
const isProduction = process.env.NODE_ENV === 'production';
const cdn = {
  css: [],
  js: [
    'https://cdn.bootcss.com/vue/2.6.10/vue.runtime.min.js',
    'https://cdn.bootcss.com/vue-router/3.0.3/vue-router.min.js',
    'https://cdn.bootcss.com/vuex/3.1.1/vuex.min.js',
    'https://cdn.bootcss.com/axios/0.19.0/axios.min.js',
    'https://cdn.jsdelivr.net/npm/echarts@4.7.0/dist/echarts.min.js'
  ]
}
module.exports = {
  configureWebpack: config => {
    // 是否为生产环境
    if (isProduction) {
      // 生产环境注入cdn
      Object.assign(
        config.externals, {
        'vue': 'Vue',
        'vuex': 'Vuex',
        'vue-router': 'VueRouter',
        'axios': 'axios'
      })
    }
  },
  chainWebpack: config => {
    if (isProduction) {
      // 向模板注入cdn
      config.plugin('html')
        .tap(args => {
          args[0].cdn = cdn;
          return args;
        });
    }
  }
}

html文件读取,webpack下配置的cdn文件

<html>
  <head>
    <!-- 使用CDN的JS文件 -->
    <% for (var i in htmlWebpackPlugin.options.cdn && htmlWebpackPlugin.options.cdn.js) { %>
    <link href="<%= htmlWebpackPlugin.options.cdn.js[i] %>" rel="preload" as="script">
    <% } %>
  </head>
</html>

2、将项目所到的插件,进行按需加载,用于本项目开发用的是vant-ui所以在官网也有相对应的按需加载配置

3、将项目进行按文件打包并压缩代码,引入terser-webpack-plugin模块

由于uglifyjs不支持ES6语法,所以用terser-webpack-plugin代替了uglifyjs-webpack-plugin

npm i terser-webpack-plugin --save
module.exports = {
  configureWebpack: config => {
    if (isProduction) {
      const TerserPlugin = require('terser-webpack-plugin')
      let optimization = {
        runtimeChunk: 'single',
        splitChunks: {
          chunks: 'all',
          maxInitialRequests: Infinity,
          minSize: 20000,
          cacheGroups: {
            vendor: {
              test: /[\\/]node_modules[\\/]/,
              name(module) {
                // get the name. E.g. node_modules/packageName/not/this/part.js
                // or node_modules/packageName
                const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
                // npm package names are URL-safe, but some servers don't like @ symbols
                return `npm.${packageName.replace('@', '')}`
              }
            }
          }
        },
        minimizer: [
          new TerserPlugin({
            terserOptions: {
              compress: {
                drop_debugger: true, // console
                drop_console: true, // 注释console
                pure_funcs: ['console.log'] // 移除console, 必须和上一条同时使用才能去除console
              }
            }
          })]
      }
      Object.assign(config, {
        optimization
      })
    }
  }  
}

完成以上的配置后,你的项目dist的包会大大的缩小

接下来我们来减少相对应的网络请求,首先我们先看看,为进行处理的时候,存在的首页请求

有83个请求,这里面包含了ajax,js,css,字体等请求,接下来我们进行相对应的配置

接下来我们配置如下信息


module.exports = {
  chainWebpack: (config) => {
    if (isProduction) {
      // 删除预加载
      config.plugins.delete('preload');
      config.plugins.delete('prefetch');
      // 压缩代码
      config.optimization.minimize(true);
      // 分割代码
      config.optimization.splitChunks({
        chunks: 'all'
      })
    }
  }
}

进行以上的配置后,我们在一次进行项目打包,然后再进行访问

首页的网络请求只有42,接近少了一倍。我们将一些不是很需要或者不是很急的交互JS页面可以往后读取的时候在进行文件的读取,这样可以加快用户打开首页的速度

下来的配置需要后端运维配合,当然如果你能熟练的操作服务器,那么接下来的配置也可以单独处理

进入nginx.conf配置文件,启动gzip访问,相关配置如下


gzip on; #是否开启
gzip_min_length 1k; #最小压缩临界值, 一般不改
gzip_buffers 4 16k; #设置用于处理请求压缩的缓冲区数量和大小,建议为默认值
gzip_comp_level 2; # 压缩级别,等级越好CPU占用越好,压缩质量越好
#压缩类型
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;

然后安装compressisonPlugin插件

npm i compression-webpack-plugin --save
chainWebpack: (config) => {
  if (isProduction) {
    config.plugin('compressionPlugin')
        .use(new CompressionPlugin({
          test: /\.js$|\.html$|.\css/, // 匹配文件名
          threshold: 10240, // 对超过10k的数据压缩
          deleteOriginalAssets: false // 不删除源文件
        }))
  }
}

这样就可以愉快的加快我们项目的访问速度了

我是godlike,每周一篇小技巧,一起快速入坑,希望能在前端道路上,和你努力,一起共勉!