使用命令
vue ui
选择配置
#创建项目名称
#选择npm包管理器
#选择【若目标文件夹已存在则将其覆盖】
#选择【手动】
#选择
-Babel
-Router
-Vuex
-Css Pre-processors
-Linter / Formater
-Unit Testing
-使用配置文件
#选择【Sass/SCSS(with dart-sass)】
#选择【EsLint + Prettier】
#选择【Mocha + Chai】
开始创建项目
# http://editorconfig.org
root = true
[*]
indent_style = space
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
统一团队的编辑器的设置。
// https://prettier.io/docs/en/options.html
module.exports = {
//标签宽度
tabWidth: 4,
//超过200字符换行
printWidth: 200,
//使用单引号而不是双引号。
singleQuote: true,
//没有尾随逗号
trailingComma: 'none',
//在对象文字中的括号之间打印空格。
bracketSpacing: true,
//将>多行JSX元素的放在最后一行的末尾,而不是一个人放在下一行
jsxBracketSameLine: false,
//在语句末尾打印分号。
semi: true,
htmlWhitespaceSensitivity: "ignore",
endOfLine: "auto"
};
eslint+prettierrc同一代码格式,eslint检测代码是否符合代码规则,prettierrc只是负责美化代码,如果使用vscode编辑器可以安装Prettier - Code formatter插件,然后格式化代码。
node_modules/
.idea/
.vscode/
build/*.js
src/assets
public
dist
.prettierrc.js
.eslintrc.js
忽略指定文件的eslint检查。
对vue和webpack进行配置
npm install amfe-flexible --save
npm install postcss-pxtorem --save
amfe-flexible插件进行自适应配置,主要包括动态计算并设置根节点的font-size,设置移动端常见的meta标签;
// src/main.js
import 'amfe-flexible';
px2rem-loader可以将指定范围的css文件中的px转化为rem;
打开vue.config.js文件
module.exports = {
css: {
loaderOptions: {
postcss: {
plugins: [
require("postcss-pxtorem")({
// 把px单位换算成rem单位
rootValue: 75, // 换算的基数(设计图750的根字体为75)
selectorBlackList: ["weui", "mu"], // 忽略转换正则匹配项
propList: ["*"]
})
]
}
}
}
};
此插件可以给存在兼容性的代码,添加不同环境需要的前缀。这里推荐使用**postcss-preset-env**插件,这个插件可以将最新的css转化为可以在生产环境使用的css代码。
安装插件:
npm install postcss-preset-env
打开vue.config.js文件,添加插件
module.exports = {
css: {
loaderOptions: {
postcss: {
plugins: [
require('postcss-preset-env'),
......
]
}
}
}
};
在项目中使用存在兼容问题的代码,例如display: flex;运行项目,查看是否有多个前缀的display: flex;例如下面:
.about[data-v-039c5b43] {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
}
使用**normalize.css**插件来实现样式的重置。
安装插件:
npm install --save normalize.css
打开main.js文件,引入插件
import 'normalize.css';
创建scss文件
// src/styles/mixin.scss
// 单行文本溢出
@mixin oneline-text-overflow {
white-space: nowrap;
word-break: keep-all;
text-overflow: ellipsis;
overflow: hidden;
}
打开vue.config.js文件,添加以下代码:
// vue.config.js
const path = require('path');
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const isAnalyz = process.argv.slice(3).some(item => item === '--analyz');
module.exports = {
css: {
loaderOptions: {
// 给 sass-loader 传递选项
sass: {
// @/ 是 src/ 的别名
// 所以这里假设你有 `src/styles/mixin.sass` 这个文件
// 注意:在 sass-loader v7 中,这个选项名是 "data"
prependData: `@import "~@/styles/mixin.scss"`
},
// 默认情况下 `sass` 选项会同时对 `sass` 和 `scss` 语法同时生效
// 因为 `scss` 语法在内部也是由 sass-loader 处理的
// 但是在配置 `data` 选项的时候
// `scss` 语法会要求语句结尾必须有分号,`sass` 则要求必须没有分号
// 在这种情况下,我们可以使用 `scss` 选项,对 `scss` 语法进行单独配置
scss: {
prependData: `@import "~@/styles/mixin.scss";`
},
......
}
},
......
};
使用声明的全局变量
// src/views/note/NoteListCell.vue
打开vue.config.js文件,添加以下代码
module.exports = {
......,
devServer: {
open: true, // 是否自动打开默认浏览器
port: 9001, // 使用的端口
progress: false // 是否显示打包进度
}
};
const path = require("path");
module.exports = {
......,
configureWebpack: {
name: "测试使用vue-cli3",
resolve: {
// 配置解析规则
alias: {
"@": path.join(__dirname, "src") // 使用@别名简写src目录所在的绝对路径
},
extensions: [".js", ".vue"] // 自动解析确定的扩展。例如:import File from '../path/to/file'
},
performance: {
// 配置如何展示性能提示。例如,如果一个资源超过 250kb,webpack 会对此输出一个警告来通知你。
maxEntrypointSize: 500000, //入口文件最大bytes(500k)
maxAssetSize: 500000 //任何单文件最大bytes(500k)
}
}
};
完成了一个简单的配置。
你可以替换你的项目根目录中的下列文件来指定环境变量:
.env # 在所有的环境中被载入
.env.local # 在所有的环境中被载入,但会被 git 忽略
.env.[mode] # 只在指定的模式中被载入
.env.[mode].local # 只在指定的模式中被载入,但会被 git 忽略
**模式(mode)**是 Vue CLI 项目中一个重要的概念。默认情况下,一个 Vue CLI 项目有三个模式:
development 模式用于 vue-cli-service serve
production 模式用于 vue-cli-service build 和 vue-cli-service test:e2e
test 模式用于 vue-cli-service test:unit
注意模式不同于 NODE_ENV
,一个模式可以包含多个环境变量。
模式的优先级:
已存在的模式 > .env.production > others
一个环境文件只包含环境变量的“键=值”对:
FOO=bar
VUE_APP_SECRET=secret
被载入的变量将会对 vue-cli-service
的所有命令、插件和依赖可用。
现在创建以下文件:
.env.development.local #创建本地开发时环境变量配置文件
.env.development #创建线上开发时环境变量配置文件
.env.production #创建线上生产时环境变量配置文件
.env.test.local #创建本地测试时环境变量配置文件
.env.test #创建线上测试时环境变量配置文件
每个文件中建议设置以下内容:
#环境变量名称
NODE_ENV='production'
#接口地址
REQUEST_BASE_URL='http://192.168.50.4:7001/'
在路由的文件夹下创建modules文件夹,文件路径:
router/
-modules/ #定义路由的模块集合
-user.js #用户模块
-index.js #读取并合并模块的路由,路由的全局处理,导出路由
读取并合并路由的代码:
const routes = (moduleFiles => {
return moduleFiles.keys().reduce((modules, modulePath) => {
const value = moduleFiles(modulePath);
modules.push(...value.default);
return modules;
}, []);
})(require.context('./modules', false, /\.js$/));
解析代码的含义:
#下面的代码表示读取当前目录下的modules目录,但是不读取modules的子目录,且只匹配.js文件
require.context('./modules', false, /\.js$/)
#moduleFiles是require.context函数返回一个读取文件的函数,类似于import
moduleFiles
#moduleFiles.keys()返回modules文件夹下所有的文件名的数组集合
moduleFiles.keys()
#reduce是一个数组累加器函数
.reduce()
#下面代码是获取文件中定义的路由数组
const value = moduleFiles(modulePath);
登录模块的路由
// src/router/modules/user.js
export default [
{
path: '/login',
name: 'login',
meta: { title: '登录' },
component: () => import('@/views/user/Login.vue')
}
];
与上面的vue router的配置相似;
在store文件夹下,创建目录:
store/
-modules/ #定义vuex的模块集合
-user.js #登录模块
-index.js #读取并合并模块,状态的全局处理,导出vuex
读取并合并路由的代码:
const modules = (modulesFiles => {
return modulesFiles.keys().reduce((modules, modulePath) => {
const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1');
const value = modulesFiles(modulePath);
modules[moduleName] = value.default;
return modules;
}, {});
})(require.context('./modules', false, /\.js$/));
解析代码的含义:
#下面的代码是通过正则获取不带后缀的文件名称
const moduleName = modulePath.replace(/^\.\/(.*)\.\w+$/, '$1');
登录模块状态
export default {
state: {},
getters: {},
mutations: {},
actions: {}
};
babel-plugin-transform-remove-console插件可以在生产环境删除开发时使用console.*函数。
安装:
npm install babel-plugin-transform-remove-console --save-dev
在babel.config.js中使用:
const isProduction = process.env.NODE_ENV === 'production';
module.exports = function(api) {
api.cache(false);
const presets = ['@vue/app'];
const plugins = [];
if (isProduction) {
plugins.push('transform-remove-console');
}
return {
presets,
plugins
};
};
webpack-bundle-analyzer插件可以帮助你分析打包的文件;
安装:
npm install --save-dev webpack-bundle-analyzer
vue.config.js文件添加插件:
......;
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
const isAnalyz = process.argv.slice(3).some(item => item === '--analyz');
module.exports = {
.......,
chainWebpack: config => {
if (isAnalyz) {
config.plugin('webpack-bundle-analyzer').use(BundleAnalyzerPlugin);
}
},
......
};
package.json文件添加命令:
"scripts": {
......,
"analyz": "vue-cli-service build --analyz"
},
安装插件
npm install axios
创建封装axios的js文件
// src/utils/axios.js
import axios from 'axios';
import store from '@/store';
import QS from 'qs';
const http = axios.create({
baseURL: process.env.VUE_APP_REQUEST_BASE_URL,
timeout: 30000,
transformRequest: [data => QS.stringify(data)],
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}
});
// request拦截器
http.interceptors.request.use(
config => {
if (store.getters.token) {
config.headers.Authorization = `${store.getters.token}`;
}
return config;
},
error => {
return Promise.reject(error);
}
);
// response拦截器
http.interceptors.response.use(
response => response.data,
error => {
return Promise.reject(error);
}
);
export default http;
使用封装后的axios
// src/api/user.js
import axios from '@/utils/axios.js';
export function postLogin(params) {
return axios.post('/user/login', params);
}
export function postVerify(params) {
return axios.post('/user/verify', params);
}
export function postCreate(params) {
return axios.post('/user/add', params);
}