项目优化上线

676 阅读3分钟

使用vue图形化管理工具

vue ui 

使用Nprogress

  • 下载 npm install --save nprogress
  • 使用依赖 在请求拦截中显示进度条 Nprogress.start() 在响应拦截器中隐藏进度条 Nprogress.done()

//引入依赖 
import Nprogress from "nprogress"; 
import "nprogress/nprogress.css"; 
// 添加请求拦截器
http.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
     Nprogress.start()
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  },
)

// 添加响应拦截器
http.interceptors.response.use(
  function (response) {
    Nprogress.done()
    // 对响应数据做点什么
    return response.data
  },
  function (error) {
    // 对响应错误做点什么
    return Promise.reject(error)
  },
)


vscode格式化不换行

.prettierrc文件下

{
  "semi":false,
  "singleQuote":true,
  "printWidth":200
}

批量移除console.log

  • 安装依赖 npm i babel-plugin-transform-remove-console --save-dev 使用插件: babel.config.js
const proPlugins = [];
// 如果是开发环境,则添加 transform-remove-console 插件
if (process.env.NODE_ENV == "production") {
  proPlugins.push("transform-remove-console");
}

module.exports = {
  presets: ["@vue/cli-plugin-babel/preset"],
  plugins: [...proPlugins],
};

生成打包报告

通过 vue-cli 的命令选项可以生成打包报告 --report 选项可以生成 report.html 以帮助分析包内容

vue-cli-service build --report

image.png

第三方库使用CDN

vue.config.js

module.exports={
    chainWebpack: (config) => {
    config.when(process.env.NODE_ENV == "production", (config) => {
      config.entry("app").clear().add("./src/main-prod.js");
      //使用外部资源文件
      config.set("externals", {
        vue: "Vue",
        "vue-router": "VueRouter",
        axios: "axios",
        lodash: "_",
        echarts: "echarts",
        nprogress: "NProgress",
        "vue-quill-editor": "VueQuillEditor"
      });
    });
    config.when(process.env.NODE_ENV == "development", (config) => {
      config.entry("app").clear().add("./src/main-dev.js");
    });
  },
}

externals.png

cdn链接

 <% if(htmlWebpackPlugin.options.isProd){ %>
    <!-- nprogress 的样式表文件 -->
    <link rel="stylesheet" href="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.css" />
    <!-- 富文本编辑器 的样式表文件 -->
    <link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.core.min.css" />
    <link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.snow.min.css" />
    <link rel="stylesheet" href="https://cdn.staticfile.org/quill/1.3.4/quill.bubble.min.css" />
    <!-- element-ui 的样式表文件 -->
    <!-- <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"> -->
    <link rel="stylesheet" href="https://cdn.staticfile.org/element-ui/2.15.2/theme-chalk/index.css">

    <!-- Vue、vue-router、axios、lodash、echarts、nprogress 外部CDN js文件 -->
    <script src="https://cdn.staticfile.org/vue/2.5.22/vue.min.js"></script>
    <script src="https://cdn.staticfile.org/vue-router/3.0.1/vue-router.min.js"></script>
    <script src="https://cdn.staticfile.org/axios/0.18.0/axios.min.js"></script>
    <script src="https://cdn.staticfile.org/lodash.js/4.17.11/lodash.min.js"></script>
    <script src="https://cdn.staticfile.org/echarts/4.1.0/echarts.min.js"></script>
    <script src="https://cdn.staticfile.org/nprogress/0.2.0/nprogress.min.js"></script>
    <!-- 富文本编辑器的 js 文件 -->
    <script src="https://cdn.staticfile.org/quill/1.3.4/quill.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue-quill-editor@3.0.4/dist/vue-quill-editor.js"></script>

    <!-- element-ui 的 js 文件 -->
    <!-- <script src="https://cdn.staticfile.org/element-ui/2.8.2/index.js"></script> -->
     <script src="https://cdn.staticfile.org/element-ui/2.15.2/index.js"></script>

    <% } %>

修改打包入口文件

vue.config.js文件,用来修改webpack的配置项
configureWebpack和chainWebpack,来自定义webpack的打包配置
configureWebpack和chainWebpack的作用完全相同

  • configureWebpack:通过操作对象的形式来修改入口文件
  • chainWebpack:通过链式编程的形式来修改入口文件
    vue.config.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");
    });
  },
}

引入外部CDN

在开发环境下,通过import来引入依赖。
在生产环境下,不使用import引入依赖,而是通过cdn来引入各种依赖,这样可以减小打包后依赖的体积。
/vue.config.js

const { defineConfig } = require("@vue/cli-service");
module.exports = defineConfig({

  chainWebpack: (config) => {
    //生产模式
    config.when(process.env.NODE_ENV == "production", (config) => {
      config.entry("app").clear().add("./src/main-prod.js");
      
    	//设置一个全局变量,在index.html中用来区分生产环境和开发环境
      config.plugin("html").tap((args) => {
        args[0].isProd = true;
        return args;
      });
    });
    //开发模式
    config.when(process.env.NODE_ENV == "development", (config) => {
      config.entry("app").clear().add("./src/main-dev.js");

      config.plugin("html").tap((args) => {
        args[0].isProd = false;
        return args;
      });
    });
  },
});

ElementUI组件按需加载

  • 在main-prod.js中,注释掉element-ui按需加载的代码
  • 在index.html的头部区域中,通过CDN加载element-ui的js和css样式

image.png /public/index.html

<% if(htmlWebpackPlugin.options.isProd){%>
  <link href="https://cdn.bootcdn.net/ajax/libs/nprogress/0.2.0/nprogress.min.css" rel="stylesheet">
  <link href="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.6/theme-chalk/index.min.css" rel="stylesheet">
  <script src="https://cdn.bootcdn.net/ajax/libs/element-ui/2.15.6/index.min.js"></script>

  <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.2.47/vue.cjs.js"></script>
  <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/axios/1.3.2/esm/axios.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/echarts/5.4.1/echarts.min.js"></script>
  <script src="https://cdn.bootcdn.net/ajax/libs/vue-router/4.1.6/vue-router.global.prod.min.js"></script>

<% } %>

路由懒加载

当打包创建项目时候,js包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。

具体需要三步:

  1. 安装 @babel/plugin-syntax-dynamic-import
    npm i @babel/plugin-syntax-dynamic-import
  2. 在babel.config.js配置文件中声明该插件
module.exports = {
  presets: ['@vue/cli-plugin-babel/preset'],
  plugins: [...proPlugin,'@babel/plugin-syntax-dynamic-import'],
}
  1. 将路由改为按需加载的形式,示例代码如下:
const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue')
const Bar = () => import(/* webpackChunkName: "group-foo" */ './Bar.vue')
const Baz = () => import(/* webpackChunkName: "group-foo" */ './Baz.vue')

开启gzip压缩

使用gzip减少文件体积,使传输速度更快

可以通过服务器端使用express做gzip压缩,其配置如下:

  1. 创建server文件夹 npm init -y
  2. 服务器端安装包 npm i express compression -D
  3. 导出包
    const compression=require("compression");
    const express=require("express")
  4. 启用中间件 app.use(compression())

/app.js

const express=require("express")
const compression=require("compression")
const app=express()

app.use(compression())      				//这个在前
app.use(express.static('./dist'))		//这个在后

app.listen(80,()=>{
  console.log("正在运行80")
})

使用pm2管理应用

  • 在服务器中安装pm2 npm i pm2 -g
  • 启动项目 pm2 start 脚本 --name 自定义名称
  • 查看运行项目 pm2 ls
  • 重启项目 pm2 restart 自定义名称
  • 停止项目 pm2 stop 自定义名称
  • 删除项目 pm2 delete 自定义名称