vue3-cli4
仓库地址====>
参考地址
Project setup
yarn install
Compiles and hot-reloads for development
yarn serve
Compiles and minifies for production
yarn build
Run your unit tests
yarn test:unit
Lints and fixes files
yarn lint
Customize configuration
See Configuration Reference.
框架说明
See Configuration Reference
关于旧版本
Vue CLI的包名称由 vue-cli改成了@vue/cli 。如果你已经全局安装了旧版本的 vue-cli(1.x或2.x),你需要先通过 npm uninstall vue-cli-g 或 yarn global remove vue-cli 卸载它。
Node 版本要求
Vue CLI需要Node.js89或更高版本(推荐811.0+)。你可以使用nvm或nvm-windows在同一台电脑中管理多个 Node版本。
安装(卸载)新版本
npm install -g @vue/cli (安装)
npm uninstall -g @vue/cli (卸载)
@vue/cli 4.5.15
项目搭建
vue create 项目名
Babel 一种能让浏览器自动识别向后兼容各版本JavaScript的功能(选)
TypeScript 一种.ts后缀兼容js的语法(不选)
Progressive Web App(PWA)Support 渐进式网络应用(不选)
Router vue的路由管理组件(选)
Vuex vue的状态仓库管理组件(选)
CSS Pre-processors CSS预编译(选)
Linter/Formatter 代码检验 格式检查(选)
Unit Testing 单元测试 以开发角度测试代码(不选)
E2E Testing e2e测试 以用户角度测试代码(不选)
目录
- √ 配置多环境变量
- √ 配置基础 vue.config.js
- √ 配置 proxy 跨域
- √ SVG 转 font 字体
- √ 使用 SVG 组件
- √ 为 sass 提供全局样式,以及全局变量
- √ 添加 IE 兼容
✅ 配置多环境变量
通过在 package.json 里的 scripts 配置项中添加–mode xxx 来选择不同环境
只有以 VUE_APP 开头的变量会被 webpack.DefinePlugin 静态嵌入到客户端侧的包中,代码中可以通过 process.env.VUE_APP_BASE_API 访问
NODE_ENV 和 BASE_URL 是两个特殊变量,在代码中始终可用
配置
在项目根目录中新建.env, .env.production, .env.de 等文件
- .env
serve 默认的本地开发环境配置
#测试环境
NODE_ENV = "development"
# 设置打包输出的目录
OUTPUT_DIR='dist'
#服务地址
VUE_APP_BASE_URL = "./"
#图片地址
VUE_APP_IMGBASE_URL = "./"
- .env.production
pro 默认的环境配置(正式服务器)
# 生产环境
NODE_ENV = "production"
# 设置打包输出的目录
OUTPUT_DIR='dist_pro'
#服务地址
VUE_APP_BASE_URL = "https://XXXXXXXX.com/"
#图片地址
VUE_APP_IMGBASE_URL = "https://XXXXXXX.com/"
- .env.test
test 默认环境配置(测试服务器)
# 测试环境
NODE_ENV = "test"
# 设置打包输出的目录
OUTPUT_DIR='dist_test'
#服务地址
VUE_APP_BASE_URL = "https://XXXXXXXX.com/"
#图片地址
VUE_APP_IMGBASE_URL = "https://XXXXXXX.com/"
修改 package.json
"scripts": {
"serve:pro": "vue-cli-service serve --mode production",
"serve:build": "vue-cli-service serve --mode production",
"serve:test": "vue-cli-service serve --mode test",
"serve:test-build": "vue-cli-service serve --mode test",
}
使用环境变量
<template>
<div class="home">
<!-- template中使用环境变量 -->
BASE_URL: {{ BASE_URL }}
</div>
</template>
<script>
export default {
name: "home",
data() {
return {
BASE_URL: process.env.VUE_APP_BASE_URL
};
},
mounted() {
// js代码中使用环境变量
console.log("BASE_URL: ", process.env.VUE_APP_BASE_URL);
}
};
</script>
✅ 配置基础 vue.config.js
module.exports = {
// 默认'/',部署应用包时的基本 URL
publicPath: IS_PROD ? process.env.VUE_APP_BASE_URL : "./",
// 生产环境构建文件的目录
outputDir: process.env.OUTPUT_DIR,
// 相对于outputDir的静态资源(js、css、img、fonts)目录
// assetsDir: "",
// eslint-loader 是否在保存的时候检查
lintOnSave: false,
// 关闭eslint
devServer: {
overlay: {
warnings: false,
errors: false
}
},
}
假设 mock 接口为https://www.easy-mock.com/mock/5bc75b55dc36971c160cad1b/sheets/1
module.exports = {
devServer: {
overlay: { // 让浏览器 overlay 同时显示警告和错误
warnings: true,
errors: true
},
// open: false, // 是否打开浏览器
// host: "localhost",
// port: "8080", // 代理断就
// https: false,
// hotOnly: false, // 热更新
proxy: {
"/api": {
target:
"https://www.easy-mock.com/mock/5bc75b55dc36971c160cad1b/sheets", // 目标代理接口地址
secure: false,
changeOrigin: true, // 开启代理,在本地创建一个虚拟服务端
// ws: true, // 是否启用websockets
pathRewrite: {
"^/api": "/"
}
}
}
}
};
访问
<script>
import axios from "axios";
export default {
mounted() {
axios.get("/api/1").then(res => {
console.log('proxy:', res);
});
}
};
</script>
✅ SVG 转 font 字体
npm i -D svgtofont
根目录新增 scripts 目录,并新建 svg2font.js 文件:
const svgtofont = require("svgtofont");
const path = require("path");
const pkg = require("../package.json");
svgtofont({
src: path.resolve(process.cwd(), "src/icons/svg"), // svg 图标目录路径
dist: path.resolve(process.cwd(), "src/assets/fonts"), // 输出到指定目录中
fontName: "icon", // 设置字体名称
css: true, // 生成字体文件
startNumber: 20000, // unicode起始编号
svgicons2svgfont: {
fontHeight: 1000,
normalize: true
},
// website = null, 没有演示html文件
website: {
title: "icon",
logo: "",
version: pkg.version,
meta: {
description: "",
keywords: ""
},
description: ``,
links: [{
title: "Font Class",
url: "index.html"
},
{
title: "Unicode",
url: "unicode.html"
}
],
footerInfo: ``
}
}).then(() => {
console.log("done!");
});
添加 package.json scripts 配置:
"font": "node scripts/svg2font.js",
执行:
npm run font
✅ 使用 SVG 组件
npm i -D svg-sprite-loader
新增 SvgIcon 组件。
<template>
<svg class="svg-icon"
aria-hidden="true">
<use :xlink:href="iconName" />
</svg>
</template>
<script>
export default {
name: 'SvgIcon',
props: {
iconClass: {
type: String,
required: true
}
},
computed: {
iconName() {
return `#icon-${this.iconClass}`
}
}
}
</script>
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
在 src 文件夹中创建 icons 文件夹。icons 文件夹中新增 svg 文件夹(用来存放 svg 文件)与 index.js 文件:
// require.context(directory,useSubdirectories,regExp)
// directory:表示检索的目录
// useSubdirectories:表示是否检索子文件夹
// regExp:匹配文件的正则表达式,一般是文件名
// 例如 require.context("@/views/components",false,/.vue$/)
const requireAll = requireContext => requireContext.keys().map(requireContext);
const req = require.context("./svg", false, /\.svg$/);
requireAll(req);
在 components 文件夹中创建 index.js 文件, 用来导出全局组件;
// 注册到全局
import SvgIcon from './SvgIcon.vue';
/**
*
install(Vue,option){
组件
指令
混入
挂载vue原型
}
*/
const pubcom = {
install(vue) {
vue.component('SvgIcon', SvgIcon)
}
}
export default pubcom
在 main.js 中导入 @/components/index.js , @/icons
// 全局组件
import pubcom from "@/components/index.js"
import "@/icons";
import {
createApp
} from "vue";
import App from "./App.vue";
createApp(App)
.use(router)
.use(pubcom)
.mount("#app");
修改 vue.config.js
const path = require("path");
const resolve = dir => path.join(__dirname, dir);
module.exports = {
chainWebpack: config => {
// svg组件
const svgRule = config.module.rule("svg");
svgRule.uses.clear();
svgRule.exclude.add(/modules/);
svgRule
.test(/\.svg$/)
// .include.add(resolve('@/icons/svg')) //添加我们要处理的文件路径
.use("svg-sprite-loader")
.loader("svg-sprite-loader")
.options({
symbolId: "icon-[name]"
});
const imagesRule = config.module.rule("images");
imagesRule.exclude.add(resolve("src/icons"));
config.module.rule("images").test(/\.(png|jpe?g|gif|svg)(\?.*)?$/);
return config;
}
};
使用 SVG 组件
<template>
<div>
<svg-icon icon-class="email"></svg-icon> 邮箱
</div>
</template>
✅ 为 sass 提供全局样式,以及全局变量
可以通过在 main.js 中 createApp(App,{KaTeX parse error: Expected 'EOF', got '}' at position 44: …APP_IMGBASE_URL}̲),然后在js中使用IMGBASE_URL 访问。
css 中可以使用注入 sass 变量访问环境变量中的配置信息
const IS_PROD = ["production", "prod"].includes(process.env.NODE_ENV);
module.exports = {
// pages
css: {
// 将组件内的 CSS 提取到一个单独的 CSS 文件 (只用在生产环境中)
// 也可以是一个传递给 `extract-text-webpack-plugin` 的选项对象
extract: false, //IS_PROD
// 是否开启 CSS source map?
sourceMap: false,
// 为预处理器的 loader 传递自定义选项。比如传递给
// Css-loader 时,使用 `{ Css: { ... } }`。
loaderOptions: {
// 这里的选项会传递给 css-loader
scss: {
// 向全局sass样式传入共享的全局变量, $src可以配置图片cdn前缀
// 详情: https://cli.vuejs.org/guide/css.html#passing-options-to-pre-processor-loaders
prependData: `
@import "@scss/base.scss";
@import "@scss/variables.scss";
@import "@scss/mixins.scss";
$src: "${process.env.VUE_APP_IMGBASE_URL}";
`
}
}
}
};
在 scss 中引用
.home {
background: url($src+"/images/500.png");
}
✅ 添加 IE 兼容
在 main.js 中添加
import 'core-js/stable';
import 'regenerator-runtime/runtime';
配置 babel.config.js
const plugins = [];
module.exports = {
presets: [["@vue/app", { useBuiltIns: "entry" }]],
plugins: plugins
};