最近稍微了解了点VUE的用法,也自己做了一个很简单的项目,这里记录一下项目的完整的开发过程,包括搭建,整合包,配置等,顺便一边记录一边重头搭一遍作为下一个练手项目的开始。
安装环境
Nodejs
安装Nodejs,自行下载安装并配置系统环境变量就行了,不过要注意下版本选择,目前我的node是16.4.1,执行一下node -v
显示版本就代表安装和配置成功啦!
vue/cli
接下来安装vue脚手架,执行命令npm install -g @vue/cli
安装或者使用淘宝镜像 cnpm install -g @vue/cli
安装即可。新版的脚手架包名是@vue/cli
(旧版是vue-cli
),如果已经安装了旧版的可以通过npm uninstall vue-cli -g
命令进行卸载,并重新安装。
等待安装完成,执行命令vue -V
,显示vue/cli版本就代表安装成功了!(我已经安装过了,这里不截图安装过程了)
搭建一个Vue项目
安装好脚手架之后,使用命令进入准备创建项目的目录下,执行命令
vue create 项目名
之后会出现如下几个选项,上面两个是我前几次创建项目时候保存的配置,另外两个Default是默认的配置,这里我们选择最后一个,手动自定义选择(方向键+回车键就可以选择啦)
之后出现如下内容,根据实际项目需要进行选择,顺便贴一下每个代表的含义,从网上找的表格
序号 | 选项 | 描述 |
---|---|---|
1 | Choose Vue version | 选择Vue版本 |
2 | Babel | vue项目中普遍使用es6语法,但有时我们的项目需要兼容低版本浏览器,这时就需要引入babel插件,将es6转成es5 |
3 | TypeScript | TypeScript通过添加类型来扩展JavaScript。通过了解JavaScript,TypeScript可以节省您捕获错误的时间并在运行代码之前提供修复。任何浏览器,任何操作系统,任何运行JavaScript的地方。 完全开源 |
4 | Progressive Web App (PWA) Support | 渐进式Web应用程序(PWA)支持 |
5 | Router | 路由 |
6 | Vuex | Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化 |
7 | CSS Pre-processors | CSS预处理器,预处理器:比如要用sass或者cssNext就要按照人家规定的语法形式,就是用人家的语法去编写,然后人家把你编写的代码转成css。 |
8 | Linter / Formatter | 格式化程序 |
9 | Unit Testing | 单元测试 |
10 | E2E Testing | 端到端(end-to-end) |
这里我按照涂上选择的,美而有额外增加,反正后续也能选择自己安装
进入下一步,选择版本,选择3.x
紧接着会提示我们选择编码规则
ESLint with error prevention only 只配置使用 ESLint 官网的推荐规则
ESLint + Airbnb config 使用 ESLint 官网推荐的规则 + Airbnb 第三方的配置
ESLint + Standard config 使用 ESLint 官网推荐的规则 + Standard
ESLint + Prettier 使用 ESLint 官网推荐的规则 +Prettier 第三方的配置 Prettier 主要是做风格统一。代码格式化工具
我这里选择了第三个
之后选择Lint on save
询问在哪里保存配置,选择第一个单独的文件
最后会询问是否将此次的选项保存为一个默认配置,我这里选择的是N,因为前面也看到我保存过啦!
最后等待项目创建成功就OK啦!
创建成功之后,可以按照提示直接启动项目,也可以使用开发软件打开项目,便于查看项目结构,之后再根据实际情况安装其他的包
config
创建好的vue3.0项目中是没有vue.config.js
的,可以自己在项目根目录下创建一个,这里我是在网上找的一个config文件,根据提示安装相应依赖包,同时可以修改输出目录名称,开发环境启动端口等配置
/* eslint-disable @typescript-eslint/no-var-requires */
const path = require("path");
const UglifyPlugin = require("uglifyjs-webpack-plugin");
const CompressionWebpackPlugin = require("compression-webpack-plugin");
/*需要npm或者yarn 安装两个第三方
npm i -D uglifyjs-webpack-plugin 或 npm yarn add -D uglifyjs-webpack-plugin
npm i -D compression-webpack-plugin 或 yarn add -D compression-webpack-plugin
*/
function resolve(dir) {
return path.join(__dirname, dir);
}
module.exports = {
publicPath: "./", // 基本路径
outputDir: "AutoViceFront", // 输出文件目录
lintOnSave: false, // eslint-loader 是否在保存的时候检查
assetsDir: "static", //放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录。
pages: undefined, // 以多页模式构建应用程序。
runtimeCompiler: false, // 是否使用包含运行时编译器的 Vue 构建版本
// 是否为 Babel 或 TypeScript 使用 thread-loader。该选项在系统的 CPU 有多于一个内核时自动启用,仅作用于生产构建,在适当的时候开启几个子进程去并发的执行压缩
parallel: require("os").cpus().length > 1,
productionSourceMap: false, // 生产环境是否生成 sourceMap 文件,一般情况不建议打开
// webpack配置
//对内部的 webpack 配置进行更细粒度的修改 https://github.com/neutrinojs/webpack-chain see https://github.com/vuejs/vue-cli/blob/dev/docs/webpack.md
chainWebpack: (config) => {
//修改文件引入自定义路径
config.resolve.alias.set("@", resolve("src"));
//修改项目标题
config.plugin("html").tap(args => {
args[0].title = "中石油副卡分配管理页";
return args;
});
},
//调整 webpack 配置 https://cli.vuejs.org/zh/guide/webpack.html#%E7%AE%80%E5%8D%95%E7%9A%84%E9%85%8D%E7%BD%AE%E6%96%B9%E5%BC%8F
configureWebpack: (config) => {
if (process.env.NODE_ENV === "production") {
// 为生产环境修改配置...
config.mode = "production";
// 利用splitChunks将每个依赖包单独打包,在生产环境下配置
// 开启gzip压缩
config.plugins.push(
new CompressionWebpackPlugin({
algorithm: "gzip",
test: /\.ts$|\.html$|\.json$|\.css/,
threshold: 10240,
minRatio: 0.8
})
);
// 开启分离js
config.optimization = {
runtimeChunk: "single",
splitChunks: {
chunks: "all",
maxInitialRequests: Infinity,
minSize: 20000, // 依赖包超过20000bit将被单独打包
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 `${packageName.replace("@", "")}`;
}
}
}
},
minimizer: [
new UglifyPlugin({
uglifyOptions: {
warnings: false,
compress: {
drop_console: true, // console
drop_debugger: false,
pure_funcs: ["console.log"] // 移除console
}
}
})
]
};
// 取消webpack警告的性能提示
config.performance = {
hints: "warning",
//入口起点的最大体积
maxEntrypointSize: 50000000,
//生成文件的最大体积
maxAssetSize: 30000000,
//只给出 ts 文件的性能提示
assetFilter: function(assetFilename) {
return assetFilename.endsWith(".ts");
}
};
} else {
// 为开发环境修改配置...
config.mode = "development";
config.optimization = {
runtimeChunk: "single",
splitChunks: {
chunks: "all",
maxInitialRequests: Infinity,
minSize: 20000, // 依赖包超过20000bit将被单独打包
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 `${packageName.replace("@", "")}`;
}
}
}
}
};
}
},
// css: {
// // 启用 CSS modules
// requireModuleExtension: false,
// // 是否使用css分离插件
// extract: true,
// // 开启 CSS source maps,一般不建议开启
// sourceMap: false,
// // css预设器配置项
// loaderOptions: {
// sass: {
// prependData: `@import "@/styles/global.scss";`,
// },
// },
// },
pwa: {}, // PWA 插件相关配置
// webpack-dev-server 相关配置 https://webpack.js.org/configuration/dev-server/
devServer: {
host: "0.0.0.0",
port: 9000, // 端口号
https: false, // https:{type:Boolean}
open: true, //配置自动启动浏览器 http://172.11.11.22:8888/rest/XX/
hotOnly: true, // 热更新
proxy: "http://localhost:8000" // 配置跨域处理,只有一个代理
/*proxy: {
//配置自动启动浏览器
"/api": {
target: "http://172.16.68.134:8089",
changeOrigin: true,
// ws: true,//websocket支持
secure: false
},
"/api1": {
target: "http://172.16.68.134:8089",
changeOrigin: true,
//ws: true,//websocket支持
secure: false
}
}*/
},
// 第三方插件配置 https://www.npmjs.com/package/vue-cli-plugin-style-resources-loader
pluginOptions: {}
};
启动项目之后,显示如下内容表示启动成功
整合vue-router
项目搭建好之后开始安装一些开发必要的包,首先是vue-router
,使用npm进行安装,不指定版本则默认安装新版本
npm install vue-router
安装成功之后,创建路由文件文件src/router/index.js
,内容大致如下
import { createRouter, createWebHistory } from 'vue-router'
const routes = [
{
path: '/',
component: () => import('@/pages')
},
{
path: '/test1',
name: 'test1',
component: () => import('@/pages/test1')
},
{
path: '/test2',
name: 'test2',
component: () => import('@/pages/test2')
}
]
const router = createRouter({
history: createWebHistory(),
routes: routes
})
export default router
之后修改默认的main.js
为如下内容,引入router
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
const app = createApp(App)
app.use(router)
app.mount('#app')
之后就可以在项目中使用router啦!实现路由跳转!
整合Element-plus
Element-ui已经针对Vue3.0推出了Element-plus,安装和使用时会有些许不同,我因为前端确实不太熟,我也记不太清2.0的用法了,这里记录一下3.0的整合用法吧!
这部分参考的是官网的指引,首先是安装
npm install element-plus --save
之后修改main.js
引入即可,也可以参考前面的指引使用按需导入等方式
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
const app = createApp(App)
app.use(router)
app.use(ElementPlus)
app.mount('#app')
后面就可以使用啦,大致用法相同,遇到不会的直接去查官方的组件文档就OK啦!
这里有个坑,就是在vue.config.js
中如果配置了css分离插件之类的东西,会导致element的ui不生效!在我另一篇博客里面有记录!
整合axios
接着装一个axios
npm install axios
为了后续接口整合方便,我们可以使用axios封装一个请求工具request.js
/**
* 封装一个axios,
* 拦截器和请求的公共参数之类的
*/
import axios from "axios";
let baseURL = '后端请求地址'
//创建axios实例
export function request(config) {
const instance = axios.create({
//配置公共请求地址
baseURL: baseURL,
timeout: 10000
});
//请求拦截器
instance.interceptors.request.use(request => {
return request;
}, error => {
console.log(error);
return Promise.error(error);
}
);
//响应拦截器
instance.interceptors.response.use(response => {
console.log(response);
return response.data;
}, error => {
switch (error.response.status) {
case 401:
console.log("响应401,无权访问");
break;
case 403:
console.log("响应403,授权过期");
break;
case 404:
console.log("响应404,NOT FOUND");
break;
case 500:
console.log("响应500,系统异常");
break;
default:
return Promise.reject(error);
}
return Promise.reject(error);
});
return instance(config);
}
export default request;
之后可以根据此请求工具封装一下各HTTP请求方式api.js
/**
* 根绝封装的request,整合一个接口请求工具
*/
import request from "./request";
const api = {
get(url, params) {
const config = {
method: "get",
url: url
};
if (params) {
config.params = params;
}
return request(config);
},
post(url, params) {
const config = {
method: "post",
url: url
};
if (params) {
config.data = params;
}
return request(config);
},
put(url, params) {
const config = {
method: "put",
url: url
};
if (params) {
config.data = params;
}
return request(config);
},
delete(url, params) {
const config = {
method: "delete",
url: url
};
if (params) {
config.params = params;
}
return request(config);
}
};
export default api;
将以上封装好之后,后续整合后端接口只需定义一个function,引入api,再根据接口规则进行调用即可,如下示例
import api from "../utils/api";
export function apiTest(param){
return api.post("xxx/yyy/zzz",param);
}
至此!一个简单的vue3.0项目整合完成,后续可以进行开发啦!开发过程中遇到什么再进行添加整合就好啦!