前言
大家好,我是Frank。最近公司准备开发一个功能,由于功能复杂,且需要多端协同开发,所以,单拎出来新建了一个git项目。项目中用到的技术也是大家耳熟能详的,比如,vue-cli3、vie-router、vue-i18n、element-ui、dayjs、eslint、stylelint等等。下面带大家一起看一下整个过程。
项目简介
该项目是一个大项目单拎出来的一个大的模块功能,因为涉及多端协作同步开发。
项目目录
![项目目录][directory]
遇到的问题
多入口
因为项目需要多端协同开发,所以设置了多入口,这样大家就可以在一个项目上共同开发了。根据
vue-cli3
官方文档进行配置,项目最外层添加vue.config.js
文件,并作如下配置
// 配置文件信息
var pageData = {
publicPath: '/client', // 项目文件部署的目录,例 https:www.baidu.com/saas
assetsDir: `assets`, // 项目中静态资源目录,若不需要可以不配置
outputDir: `./dist`, // 项目文件打包后输出的问卷目录
buildVersion: new Date().valueOf(),
entry: `./src/pages/main.js`, // 项目入口文件
template: `./src/pages/index.html`, // 项目默认html模板
filename: 'index.html',
title: `...`,
}
// 根据不同入口配置
switch (pageName){
case 'pc':
case 'mb':
pageData.publicPath = `/client/team/${pageName}`;
pageData.outputDir = `./dist/client/team/${pageName}`;
pageData.entry = `./src/main_${pageName}.js`;
pageData.template = `./src/index_${pageName}.html`;
break;
case 'www':
pageData.publicPath = `/saas/team/${pageName}`;
pageData.outputDir = `./dist/client/team/${pageName}`;
pageData.entry = `./src/main_${pageName}.js`;
pageData.template = `./src/index_${pageName}.html`;
break;
default:
pageData.publicPath = `/saas/team/${pageName}`;
pageData.outputDir = `./dist/client/team/${pageName}`;
pageData.entry = `./src/main_${pageName}.js`;
pageData.template = `./src/index_${pageName}.html`;
break;
}
module.exports = {
publicPath: pageData.publicPath,
assetsDir: pageData.assetsDir,
outputDir: pageData.outputDir,
productionSourceMap: false, // 是否开启生产模式下的sourceMap压缩
lintOnSave: true, // 是否开始eslint校验的控制台打印错误信息
css: {
loaderOptions: {
css: {},
postcss: {
plugins: (loader)=>[
// Add the plugin
new IconfontWebpackPlugin(loader), // 一个插件,用于将icon转为svg,兼容低版本浏览器,可以忽略
]
}
}
},
chainWebpack: (config)=>{
config.resolve.alias
.set('@', resolve('src'))
.set('_assets', resolve('src/assets')); // 路径别名
fs.remove(pageData.outputDir + '/' + pageData.assetsDir); // 打包文件路径,每次打包之前删除旧的文件
},
// devServer的相关配置可以查看vue-cli官网
devServer: {
disableHostCheck: true,
host: hosts.local,
openPage: pageData.filename,
progress: false,
port: port,
proxy: {
'^/assets': {
target: 'http://localhost:8501',
changeOrigin: true,
pathRwrite: {
'/config/': '/server/' + hosts.base + '/config/',
'/': '/'
}
}
},
},
// 真正启动的项目对应的入口文件
pages: {[pageName]: {
buildVersion: pageData.buildVersion,
entry: pageData.entry,
template: pageData.template,
filename: pageData.filename,
title: pageData.title,
}}
}
以上是主要内容,作用在注释中说明。仔细看过后就会发现其实就是多个入口的参数按照规则匹配到正确的入口,最终还是输出的单个入口,最后在添加好对应的入口文件即可。详细内容建议查看vue-cli官方文档
国际化
因为项目需要做海外版。同样使用官方推荐的插件
vue-i18n
。由于有些插件还需要单独配置国际化,所以下面单独来说每一部分的具体配置:
- 项目本身多语言抽取
我们在
lang
文件目录下抽取项目中的语言文件包,然后抛出来,在index.js
中配置,最后在main.js
中引入即可。先来看下lang
文件目录
下面看一下
index.js
文件的配置信息
import Vue from 'vue';
import VueI18n from 'vue-i18n';
import messages from '@/lang/en';
import axios from 'axios';
Vue.use(VueI18n);
// 初始化i18n实例
export const i18n = new VueI18n({
locale: 'en', // 设置语言环境
fallbackLocale: 'en',
messages: {en: messages} // 设置语言环境信息,注意这里的书写方法
})
const loadedLanguages = ['en'] // 我们的预装默认语言
// 设置浏览器的语言
function setI18nLanguage(lang){
i18n.locale = lang;
axios.defaults.headers.common['Accept-Language'] = lang;
document.querySelector('html').setAttribute('lang', lang);
return lang;
}
// 按需加载语言包
export function loadLanguageAsync(lang){
if (i18n.locale !== lang){
if (!loadedLanguages.includes(lang)){
return import(/* webpackChunkName: "lang-[request]" */ '@/lang/' + lang).then(msgs=>{
i18n.setLocaleMessage(lang, msgs.default);
loadedLanguages.push(lang);
return setI18nLanguage(lang);
})
}
return Promise.resolve(setI18nLanguage(lang));
}
return Promise.resolve(lang);
}
以上是主要内容,依然是在注释中解释代码作用,希望大家仔细阅读。需要注意的是默认加载的语言包最终引入的就是你语言包里抛出的内容,如果语言包没有配置语言类型,需要自己加上语言类型
en
。这也是官网推荐的示例。下面来看下main.js
配置
import Vue from 'vue';
import App from './app_saas.vue';
import {i18n, loadLanguageAsync} from '@/lang/index.js';
import VueCookie from 'vue-cookie';
Vue.config.productionTip = false;
// 判断需要加载的语言包
let routeQueryLang = router.resolve(window.location.hash.substr(1)).route.query.lang;
if (routeQueryLang){
VueCookie.set('locationArgumentLang', routeQueryLang === 'zh-CN' ? 'zh-CN' : 'en');
}
let siteLanguage = VueCookie.get('locationArgumentLang') || navigator.language || 'zh-CN';
loadLanguageAsync(siteLanguage);
// 生成Vue实例,并将初始化好的 i18n 实例挂载到Vue上即可
new Vue({
router,
i18n,
render: h=>h(App),
}).$mount('#app')
因为项目中判断给用户加载的语言的逻辑是这样的:如果用户选择了某种语言,那么会存到
cookie
中,下次会默认加载该语言;若没有设置,那就会取浏览器的语言;若还没有,会默认加载英文。
element-ui
多语言配置
在上面基础上再添加
element-ui
的语言包,然后main.js
中添加如下代码
Vue.use(ElementUI, {
i18n: (key, value)=>i18n.t(key, value)
})
同样是官网推荐配置
dayjs
多语言配置
index.js
中添加如下代码
// 按需加载dayjs语言包
function loadLanguageDayjs(lang){
lang = lang.toLowerCase();
return import('dayjs/locale/' + lang).then(()=>{
return dayjs.locale(lang);
})
}
需要注意的是
dayjs
中参数都是小写的,比如中文element-ui
是zh-CN
,dayjs
是zh-cn
。详细内容见官网推荐配置
eslint
配置
因为要规范代码风格,所以引入了
eslint
来校验。
首先,项目中需要引入以下插件
yarn add --dev @vue/cli-plugin-babel @vue/cli-plugin-babel babel-eslint eslint eslint-plugin-vue
其次,项目最外层添加文件 .eslintrc.js
,下面是我项目中的配置
module.exports = {
root: true, // 检测到最近一级.eslintrc*
env: {
es6: true, // 支持并启用es6语法
node: true, // 支持node语法及变量
browser: true, // 支持浏览器全局变量
},
extends: ['plugin:vue/recommended', 'eslint:recommended'], // 第三方插件
plugins: ['vue'],
parserOptions: {
parser: 'babel-eslint', // 解析器,默认使用Espree
ecmaVersion: 2018,
sourceType: 'module', // 指定文件来源类型,"script" (默认) 或 "module"(如果你的代码是 ECMAScript 模块)
},
// 全局变量不做校验
globals: {
moment: 'writable',
Vue: 'writable',
VueRouter: 'writable',
VueI18n: 'writable',
ELEMENT: 'writable',
TWEEN: 'writable',
_: 'writable',
},
rules: {
indent: ['error', 2, {SwitchCase: 1}],
'no-debugger': 0,
'no-console': 1,
'no-unused-vars': 1,
eqeqeq: 2,
quotes: ['error', 'single', {'allowTemplateLiterals': true}],
'no-irregular-whitespace': 2, // 禁止不规则的空格
'no-multi-spaces': 'error', // 禁止多个空格
'space-infix-ops': 2, // 运算符前后禁止多个空格
'array-bracket-spacing': ['error', 'never'], // 数组统一空格
'block-spacing': ['error', 'always'],
'comma-spacing': ['error'],
'comma-style': ['error', 'last'],
'computed-property-spacing': ['error', 'never'],
'func-call-spacing': ['error', 'never'],
'key-spacing': ['error', {'beforeColon': false, 'afterColon': true}], // 冒号空格
'keyword-spacing': ['error', {'before': true}], //if () {}空格else
'no-whitespace-before-property': 'error',
'semi-spacing': 'error', //分号空格
'space-before-blocks': ['error', 'never'], //function name()空格{}
'space-before-function-paren': ['error', 'never'], //function name空格(){}
'space-in-parens': ['error', 'never'],
'arrow-spacing': ['error', {'before': false, 'after': false}], //()空格=>空格{}
'rest-spread-spacing': ['error', 'never'], // 空格...空格{}
'no-unreachable': 1,
'no-trailing-spaces': 2,
'object-curly-spacing': ['error', 'never'],
// 'vetur.validation.template': false,
// 'vue/valid-template-root': 'off',
'vue/no-v-html': 0,
'vue/component-tags-order': ['error', {'order': ['style', 'template', 'script']}],
'vue/html-quotes': ['error', 'double'],
'vue/require-v-for-key': 1, // v-for要有key
'vue/html-self-closing': 'off', // 标签闭合
'vue/html-closing-bracket-newline': ['error', {
'singleline': 'never',
'multiline': 'never'
}],
'vue/html-closing-bracket-spacing': 'error', // 标签后是否允许空格
'vue/html-end-tags': 'error', // 标签自我关闭
'vue/mustache-interpolation-spacing': 'error', // 标签插值中前后固定一个空格
'vue/no-reserved-component-names': 'error', // 禁止保留名称
'vue/no-unsupported-features': 1, // 未支持的语法
'vue/no-unused-components': 1, // 未注册的组件
'vue/padding-line-between-blocks': 1, //
'vue/no-use-v-if-with-v-for': 1,
// "vue/static-class-names-order": 1, // name属性
'vue/max-attributes-per-line': ['error', { // 单行和多行属性数量
'singleline': 10,
'multiline': {
'max': 1,
'allowFirstLine': false
}
}],
},
};
大家可以按照自己需要的规范来配置,具体配置规则见eslint官网和eslint-plugin-vue官网
最后,我们需要忽略一部分文件的校验。那么我们需要在 .eslintrc.js
同级添加 .eslintignore
,以下是我们项目忽略内容,大家可以根据实际情况配置
node_modules
dist
stylelint
配置
可能大多数开发人员不会去规范css书写,因为我们leader要求,所以添加了。
首先,需要加载以下插件
yarn add --dev stylelint stylelint-config-standard stylelint-order
其次,同eslint,添加 .stylelintrc.js
文件,并作如下配置
module.exports = {
extends: ['stylelint-config-standard'],
plugins: ["stylelint-order"],
rules:{
'no-descending-specificity':null,
'function-url-quotes': 'always',
'string-quotes': 'double',
'indentation': 2,
'color-hex-case': 'upper',
'color-hex-length': 'long',
'rule-empty-line-before': 'never',
'font-family-no-missing-generic-family-keyword': null,
'block-opening-brace-space-before':'always',
'property-no-unknown':null,
'no-empty-source':null,
}
}
这里直接使用了插件规则
stylelint-config-standard
和stylelint-order
。stylelint官网
最后,同样忽略的文件需要在 stylelintignore
中配置
dist
node_modules
后记
好了,这次的分享到这里,希望对大家有所帮助,如果可以的话,给点个赞哦。嘻嘻~~
[directory]:data:image/png;base64,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
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 作者: Frank。 原文链接:https://juejin.im/post/6857432749172031502