# vue_shop **Repository Path**: nfxyj/vue_shop ## Basic Information - **Project Name**: vue_shop - **Description**: vue电商项目 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-12-30 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vue_shop项目总结 ## 项目编写 1. 了解业务和需求 2. 功能划分 3. 项目开发模式以及技术选型 4. 项目初始化 5. 数据准备,接口配置 6. 项目分模块编写 ## 项目优化 1. 通过nprogress添加进度条效果 安装`NProgress`插件,并在`request`拦截器中开启进度条,在`response`拦截器中结束进度条 2. 解决serve命令中提示的ESLint语法错误 根据`ESLint`报警信息修改项目 3. 在执行build命令期间移除所有的console 1. 安装`babel-plugin-transform-remove-console`插件并使用该插件移除console信息 2. 在`.babel.config.js`文件中进行相应发布阶段移除console的配置 ```js // 这是项目发布阶段需要用到的 babel 插件 const prodPlugins = [] if (process.env.NODE_ENV === 'production') { prodPlugins.push('transform-remove-console') } module.exports = { presets: ['@vue/cli-plugin-babel/preset'], plugins: [ ...prodPlugins ] } ``` 4. 生成打包报告 1. 通过命令行参数的形式生成报告 ```js // 通过 vue-cli 的命令选项可以生成打包报告 // --report 选项可以生成 report.html 以帮助分析包内容 vue-cli-service build --report ``` 2. 通过可视化的UI面板直接查看报告(推荐) 在可视化的UI面板中,通过控制台和分析面板,可以方便地看到项目中所存在的问题。 5. 通过`vue.config.js`修改webpack的默认配置 **为开发模式与发布模式指定不同的打包入口** 默认情况下,Vue项目的开发模式与发布模式,共用同一个打包的入口文件(即 `src/main.js`)。 为了将项目 的开发过程与发布过程分离,我们可以为两种模式,各自指定打包的入口文件,即: - 开发模式的入口文件为 `src/main-dev.js ` - 发布模式的入口文件为 `src/main-prod.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') }) } } ``` 6. 通过externals加载外部CDN资源 默认情况下,通过 import 语法导入的第三方依赖包,最终会被打包合并到同一个文件中,从而导致打包成功 后,单文件体积过大的问题。 为了解决上述问题,可以通过 webpack 的 externals 节点,来配置并加载外部的 CDN 资源。凡是声明在 externals 中的第三方依赖包,都不会被打包。 1. 在`vue.config.js`文件`chainWebpack`中添加如下配置 ```js config.set('externals', { vue: 'Vue', 'vue-router': 'VueRouter', axios: 'axios', lodash: '_', echarts: 'echarts', nprogress: 'NProgress', 'vue-quill-editor': 'VueQuillEditor' }) ``` 2. 在`public/index.html`文件的头部区域加载外部CDN资源 ```html ``` 7. 通过CDN优化ElementUI的打包 虽然在开发阶段,我们启用了 `element-ui` 组件的按需加载,尽可能的减少了打包的体积,但是那些被按需加 载的组件,还是占用了较大的文件体积。此时,我们可以将 `element-ui` 中的组件,也通过 CDN 的形式来加 载,这样能够进一步减小打包后的文件体积 1. 在 `main-prod.js` 中,注释掉` element-ui `按需加载的代码 2. 在 `index.html` 的头部区域中,通过 CDN 加载 `element-ui` 的 `js `和` css `样式 ```html ``` 8. 自定制首页内容 不同的打包环境下,首页内容可能会有所不同。我们可以通过插件的方式进行定制,插件配置如下: ```js chainWebpack: config => { config.when(process.env.NODE_ENV === 'production', config => { config.plugin('html').tap(args => { args[0].isProd = true return args }) }) config.when(process.env.NODE_ENV === 'development', config => { config.plugin('html').tap(args => { args[0].isProd = false return args }) }) } ``` 2. 在 `public/index.html` 首页中,可以根据 `isProd` 的值,来决定如何渲染页面结构: ```html <%= htmlWebpackPlugin.options.isProd ? '' : 'dev - ' %>电商后台管理系统 <% if(htmlWebpackPlugin.options.isProd) { %> <% } %> ``` 9. **实现路由懒加载** 当打包构建项目时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成 不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了 1. 安装 `@babel/plugin-syntax-dynamic-import` 包 2. 在 `babel.config.js` 配置文件中声明该插件 3. 将路由改为按需加载的形式,示例代码如下 ```js const Foo = () => import(/* webpackChunkName: "group-foo" */ './Foo.vue') const Bar = () => import(/* webpackChunkName: "group-foo" */ './Bar.vue') const Baz = () => import(/* webpackChunkName: "group-boo" */ './Baz.vue') ``` 关于路由懒加载的详细文档,可参考如下链接: https://router.vuejs.org/zh/guide/advanced/lazy-loading.html ## 项目上线 1. 通过node创建web服务器 创建 node 项目,并安装 express,通过 express 快速创建 web 服务器,将 vue 打包生成的 dist 文件夹, 托管为静态资源即可,关键代码如下 ```js const express = require('express') // 创建 web 服务器 const app = express() // 托管静态资源 app.use(express.static('./dist')) // 启动 web 服务器 app.listen(80, () => { console.log('web server running at http://127.0.0.1') }) ``` 2. 开启文件的Gzip网络传输压缩 使用 gzip 可以减小文件体积,使传输速度更快 可以通过服务器端使用 Express 做 gzip 压缩。其配置如下: ```js // 安装相应包 npm install compression -S const express = require('express') const compression = require('compression') const app = express() app.use(compression()) app.use(express.static('./dist')) app.listen(80,()=>{ console.log("server running at http://127.0.0.1:80") }) ``` 3. 配置HTTPS服务 为什么要启用 HTTPS 服务? - 传统的 HTTP 协议传输的数据都是明文,不安全 - 采用 HTTPS 协议对传输的数据进行了加密处理,可以防止数据被中间人窃取,使用更安全 配置 HTTPS 服务 1. 进入 https://freessl.cn/ 官网,输入要申请的域名并选择品牌 2. 输入自己的邮箱并选择相关选项 3. 验证 DNS(在域名管理后台添加 TXT 记录) 4. 验证通过之后,下载 SSL 证书( full_chain.pem 公钥;private.key 私钥)。 在后台项目中导入证书 ```js const https = require('https'); const fs = require('fs'); const options = { cert: fs.readFileSync('./full_chain.pem'), key: fs.readFileSync('./private.key') } https.createServer(options, app).listen(443); ``` 4. 使用pm2管理应用 1. 在服务器中安装 pm2:`npm i pm2 -g` 2. 启动项目:`pm2 start 脚本 --name 自定义名称` 3. 查看运行项目:`pm2 ls` 4. 重启项目:`pm2 restart 自定义名称/id` 5. 停止项目:`pm2 stop 自定义名称/id` 6. 删除项目:`pm2 delete 自定义名称/id`