Vue项目优化

538 阅读3分钟

vue项目优化 第二遍边看视频边整理, 对了在这里推荐一下 Preview Enhanced插件, 在vscode中很好使用, 可以边写md文件, 边看效果 写这边文章为了pp好看, 另外也为了自己总结整理

项目打包报告

安装和配置webpack-bundle-analyzer -D

 chainWebpack: config => {
    config
      .plugin('webpack-bundle-analyzer')
      .use(require('webpack-bundle-analyzer').BundleAnalyzerPlugin)
    // config.module.rule('js').include.add(/node_modules\/(dom7|swiper)\/.*/);
    if (debug) {
      // 本地开发配置
    } else {
      // 生产开发配置
    }
  },

生成打包报告

  • 通过安装vue cli npm install -g @vue/cli
  • 然后使用vue ui 在里面有一个build, 运行, 完成之后就能看到打包体积

通过 chainWebpack 自定义打包入口

  • 创建一个vue.config.js文件
  • 创建两个main文件, 分别为main-prod.js 和main-dev.js
  • 然后再不同的环境中使用不同的js, 开发的时候使用开发那
  • 在里面写入一下代码
  module.exports = {
    chainWebpack: config => {
      config.when(process.env.NODE_ENV === 'production', config => {
        config.entry('app').clear().add('./src/main-prod.js')
      })
      config.when(process.env.NODE_ENV === 'development', config => {
        config.entry('app').clear().add('./src/main-dev.js')
      })
    }
  }

通过externals 加载外部cdn资源, 从而减少打包体积

  • 继续在vue.config.js中的生产模式下配置
  config.set('externals', {
    vue: 'Vue',
    'vue-router': 'VueRouter',
    axios: 'axios',
    lodash: '_',
    echarts: 'echarts',
    nprogress: 'NProgress',
    'vue-quill-editor': 'VueQuillEditor'
  })
  • 需要在public/index.html文件中添加cnd资源引用
  <link rel="stylesheet" href="https://cdn.dfd.css">
  • 注意这里是将那些样式表, 或者js在html中使用cdn的方式引入, 但是在main.js中也得引入 比如: import echarts from 'echarts'; 但是如果使用了以上externals配置, 打包的时候就不会将该文件打进去, 而是使用cdn的方式

element使用cdn的方式引入

  <link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.8.2/theme-chalk/index.css" /> 

  <script src="https://cdn.staticfile.org/element-ui/2.8.2/index.js"></script>
  • 这样就可以不用再main.js中引入

首页内容自定制

  • 当前需求: 在开发环境时, 给前面添加一个dev
  config.when(process.env.NODE_ENV == 'production', config => {
    config.plugin('html').tap(args=> { //args是参数项, 给里面添加一个isProd属性
      args[0].isProd = true;
      return args
    })
  })
  config.when(process.env.NODE_ENV == 'development', config => {
    config.plugin('html').tap(args=> {
      args[0].isProd = false; // 这样的话, 就可以在页面中根据isProd的值, 来决定如何渲染页面结构
      return args
    })
  })
  <title><%= html.WebpackPlugin.options.isProd? '' : 'dev' %>电商后台</title>
<% if(htmlWebpackPlugin.options.isProd) {  %>
<!- 通过cnd引入的资源 --> // 这样的话就能实现, 这里面使用cdn资源, 也就是在开发模式下面不会使用cdn, 而是使用import的方式, 就会快一点
<% } %>

路由懒加载的方式

  • 安装@babel/plugin-syntax-dynamic-import包

  • 在babel.config.js配置文件中申明该插件

  • 将路由改为按需加载的形式, 示例代码如下:

      const Foo = () => import (/* webpackChunkName: "group-foo" */ './Foo.vue'); // 这里就能使用懒加载的方式
    
  • 需要重点强调的是:

  • 使用前需要安装babel, 才能使用() => import 的方式

  • 里面的webpackChunkName不是没有用, 他后面的group-foo就是打包成功后的一个js文件, 如果同名的太多的话, 会导致该文件体积过大

项目上线

  • 通过node创建web服务器
  • 通过npm init -y 初始化环境
  • 然后下载express 插件
  • node 执行以下app.js文件
const express = require('express');
// 创建服务器
const app = express();
// 托管金泰资源
app.use('express.statis('./dist')) //dist就是打包之后的文件目录
// 启动服务器
app.listen(80, ()=> {
  console.log('web server running at http://127.0.0.1')
})

开启gzip 配置

  • 使用gzip keyi8减小文件体积, 使得传输快
  • 默认是没有开启的, 该文件在网络中有多大, 就会发送多大
  // 安装包
  npm i compression -D;
  // 导入包
  const compression = require('compression');
  //启动中间件
  app.use(compression()); // 这句代码一定要执行在静态资源之前
  app.use(express.static('./dist'))

配置https服务器

  • 为什么要配置?
  • 传统的https协议传输的数据是明文, 不安全
  • 采用https协议对传输的数据进行了加密处理, 可以防止数据被中间人窃取, 使用更安全

申请SSL证书(freessl.org) 个人用户免费

输入自己的邮箱选择相关选项

验证DNS(在域名管理后台添加TXT 记录)

验证通过之后, 下载SSL证书(full_chain.pem 公钥; private.key 私钥)

one hour 且读且珍惜