前端-项目搭建规范

一. 代码规范

1.1. 集成editorconfig配置

EditorConfig 有助于为不同 IDE 编辑器上处理同一项目的多个开发人员维护一致的编码风格。

# http://editorconfig.orgroot=true[*]# 表示所有文件适用charset=utf-8# 设置文件字符集为 utf-8indent_style=space# 缩进风格(tab | space)indent_size=2# 缩进大小end_of_line=lf# 控制换行类型(lf | cr | crlf)trim_trailing_whitespace=true# 去除行首的任意空白字符insert_final_newline=true# 始终在文件末尾插入一个新行[*.md]# 表示仅 md 文件适用以下规则max_line_length=offtrim_trailing_whitespace=false

VSCode需要安装一个插件:EditorConfig for VS Code

网络异常取消重新上传

1.2. 使用prettier工具

Prettier 是一款强大的代码格式化工具,支持 JavaScript、TypeScript、CSS、SCSS、Less、JSX、Angular、Vue、GraphQL、JSON、Markdown 等语言,基本上前端能用到的文件格式它都可以搞定,是当下最流行的代码格式化工具。

1.安装prettier

npm install prettier -D

2.配置.prettierrc文件:

useTabs:使用tab缩进还是空格缩进,选择false;

tabWidth:tab是空格的情况下,是几个空格,选择2个;

printWidth:当行字符的长度,推荐80,也有人喜欢100或者120;

singleQuote:使用单引号还是双引号,选择true,使用单引号;

trailingComma:在多行输入的尾逗号是否添加,设置为 none;

semi:语句末尾是否要加分号,默认值true,选择false表示不加;

{"useTabs":false,"tabWidth":2,"printWidth":80,"singleQuote":true,"trailingComma":"none","semi":false}

3.创建.prettierignore忽略文件

/dist/*

.local

.output.js

/node_modules/**

**/*.svg

**/*.sh

/public/*

4.VSCode需要安装prettier的插件

网络异常取消重新上传

5.测试prettier是否生效

测试一:在代码中保存代码;

测试二:配置一次性修改的命令;

在package.json中配置一个scripts:

"prettier":"prettier --write ."

1.3. 使用ESLint检测

1.在前面创建项目的时候,我们就选择了ESLint,所以Vue会默认帮助我们配置需要的ESLint环境。

2.VSCode需要安装ESLint插件:

网络异常取消重新上传

3.解决eslint和prettier冲突的问题:

安装插件:(vue在创建项目时,如果选择prettier,那么这两个插件会自动安装)

npm i eslint-plugin-prettier eslint-config-prettier -D

添加prettier插件:

extends: ["plugin:vue/vue3-essential","eslint:recommended","@vue/typescript/recommended","@vue/prettier","@vue/prettier/@typescript-eslint",    'plugin:prettier/recommended'  ],

1.4. git Husky和eslint

虽然我们已经要求项目使用eslint了,但是不能保证组员提交代码之前都将eslint中的问题解决掉了:

也就是我们希望保证代码仓库中的代码都是符合eslint规范的;

那么我们需要在组员执行 git commit 命令的时候对其进行校验,如果不符合eslint规范,那么自动通过规范进行修复;

那么如何做到这一点呢?可以通过Husky工具:

husky是一个git hook工具,可以帮助我们触发git提交的各个阶段:pre-commit、commit-msg、pre-push

如何使用husky呢?

这里我们可以使用自动配置命令:

npx husky-init && npm install

这里会做三件事:

1.安装husky相关的依赖:

网络异常取消重新上传

2.在项目目录下创建 .husky 文件夹:

npx huksy install

网络异常取消重新上传

3.在package.json中添加一个脚本:

网络异常取消重新上传

接下来,我们需要去完成一个操作:在进行commit时,执行lint脚本:

网络异常取消重新上传

这个时候我们执行git commit的时候会自动对代码进行lint校验。

1.5. git commit规范

1.5.1. 代码提交风格

通常我们的git commit会按照统一的风格来提交,这样可以快速定位每次提交的内容,方便之后对版本进行控制。

网络异常取消重新上传

但是如果每次手动来编写这些是比较麻烦的事情,我们可以使用一个工具:Commitizen

Commitizen 是一个帮助我们编写规范 commit message 的工具;

1.安装Commitizen

npm install commitizen -D

2.安装cz-conventional-changelog,并且初始化cz-conventional-changelog:

npx commitizen init cz-conventional-changelog --save-dev --save-exact

这个命令会帮助我们安装cz-conventional-changelog:

网络异常取消重新上传

并且在package.json中进行配置:

网络异常取消重新上传

这个时候我们提交代码需要使用 npx cz:

第一步是选择type,本次更新的类型

Type作用

feat新增特性 (feature)

fix修复 Bug(bug fix)

docs修改文档 (documentation)

style代码格式修改(white-space, formatting, missing semi colons, etc)

refactor代码重构(refactor)

perf改善性能(A code change that improves performance)

test测试(when adding missing tests)

build变更项目构建或外部依赖(例如 scopes: webpack、gulp、npm 等)

ci更改持续集成软件的配置文件和 package 中的 scripts 命令,例如 scopes: Travis, Circle 等

chore变更构建流程或辅助工具(比如更改测试环境)

revert代码回退

第二步选择本次修改的范围(作用域)

网络异常取消重新上传

第三步选择提交的信息

网络异常取消重新上传

第四步提交详细的描述信息

网络异常取消重新上传

第五步是否是一次重大的更改

网络异常取消重新上传

第六步是否影响某个open issue

网络异常取消重新上传

我们也可以在scripts中构建一个命令来执行 cz:

网络异常取消重新上传

1.5.2. 代码提交验证

如果我们按照cz来规范了提交风格,但是依然有同事通过 git commit 按照不规范的格式提交应该怎么办呢?

我们可以通过commitlint来限制提交;

1.安装 @commitlint/config-conventional 和 @commitlint/cli

npm i @commitlint/config-conventional @commitlint/cli -D

2.在根目录创建commitlint.config.js文件,配置commitlint

module.exports = {extends: ['@commitlint/config-conventional']}

3.使用husky生成commit-msg文件,验证提交信息:

npx husky add .husky/commit-msg "npx --no-install commitlint --edit $1"

二. 第三方库集成

2.1. vue.config.js配置

vue.config.js有三种配置方式:

方式一:直接通过CLI提供给我们的选项来配置:

比如publicPath:配置应用程序部署的子目录(默认是 /,相当于部署在 https://www.my-app.com/);

比如outputDir:修改输出的文件夹;

方式二:通过configureWebpack修改webpack的配置:

可以是一个对象,直接会被合并;

可以是一个函数,会接收一个config,可以通过config来修改配置;

方式三:通过chainWebpack修改webpack的配置:

是一个函数,会接收一个基于webpack-chain的config对象,可以对配置进行修改;

constpath =require('path')module.exports = {outputDir:'./build',// configureWebpack: {//  resolve: {//    alias: {//      views: '@/views'//    }//  }// }// configureWebpack: (config) => {//  config.resolve.alias = {//    '@': path.resolve(__dirname, 'src'),//    views: '@/views'//  }// },chainWebpack:(config) =>{    config.resolve.alias.set('@', path.resolve(__dirname,'src')).set('views','@/views')  }}

2.2. vue-router集成

安装vue-router的最新版本:

npm install vue-router@next

创建router对象:

import{ createRouter, createWebHashHistory }from'vue-router'import{ RouteRecordRaw }from'vue-router'constroutes: RouteRecordRaw[] = [  {path:'/',redirect:'/main'},  {path:'/main',component:() =>import('../views/main/main.vue')  },  {path:'/login',component:() =>import('../views/login/login.vue')  }]constrouter = createRouter({  routes,history: createWebHashHistory()})exportdefaultrouter

安装router:

importrouterfrom'./router'createApp(App).use(router).mount('#app')

在App.vue中配置跳转:

2.3. vuex集成

安装vuex:

npm install vuex@next

创建store对象:

import{ createStore }from'vuex'conststore = createStore({state(){return{name:'coderwhy'}  }})exportdefaultstore

安装store:

createApp(App).use(router).use(store).mount('#app')

在App.vue中使用:

{{ $store.state.name }}

2.4. element-plus集成

Element Plus,一套为开发者、设计师和产品经理准备的基于 Vue 3.0 的桌面端组件库:

相信很多同学在Vue2中都使用过element-ui,而element-plus正是element-ui针对于vue3开发的一个UI组件库;

它的使用方式和很多其他的组件库是一样的,所以学会element-plus,其他类似于ant-design-vue、NaiveUI、VantUI都是差不多的;

安装element-plus

npm install element-plus

2.4.1. 全局引入

一种引入element-plus的方式是全局引入,代表的含义是所有的组件和插件都会被自动注册:

importElementPlusfrom'element-plus'import'element-plus/lib/theme-chalk/index.css'importrouterfrom'./router'importstorefrom'./store'createApp(App).use(router).use(store).use(ElementPlus).mount('#app')

2.4.2. 局部引入

也就是在开发中用到某个组件对某个组件进行引入:

<template>

  <div id="app">

    <router-link to="/login">登录</router-link>

    <router-link to="/main">首页</router-link>

    <router-view></router-view>

    <h2>{{ $store.state.name }}</h2>

    <el-button>默认按钮</el-button>

    <el-button type="primary">主要按钮</el-button>

    <el-button type="success">成功按钮</el-button>

    <el-button type="info">信息按钮</el-button>

    <el-button type="warning">警告按钮</el-button>

    <el-button type="danger">危险按钮</el-button>

  </div>

</template>

<script lang="ts">

import { defineComponent } from 'vue'

import { ElButton } from 'element-plus'

export default defineComponent({

  name: 'App',

  components: {

    ElButton

  }

})

</script>

<style lang="less">

</style>

但是我们会发现是没有对应的样式的,引入样式有两种方式:

全局引用样式(像之前做的那样);

局部引用样式(通过babel的插件);

1.安装babel的插件:

npm install babel-plugin-import -D

2.配置babel.config.js

module.exports = {plugins: [    ['import',      {libraryName:'element-plus',customStyleName:(name) =>{return`element-plus/lib/theme-chalk/${name}.css`}      }    ]  ],presets: ['@vue/cli-plugin-babel/preset']}

但是这里依然有个弊端:

这些组件我们在多个页面或者组件中使用的时候,都需要导入并且在components中进行注册;

所以我们可以将它们在全局注册一次;

import{  ElButton,  ElTable,  ElAlert,  ElAside,  ElAutocomplete,  ElAvatar,  ElBacktop,  ElBadge,}from'element-plus'constapp = createApp(App)constcomponents = [  ElButton,  ElTable,  ElAlert,  ElAside,  ElAutocomplete,  ElAvatar,  ElBacktop,  ElBadge]for(constcpnofcomponents) {  app.component(cpn.name, cpn)}

2.5. axios集成

安装axios:

npm install axios

封装axios:

importaxios, { AxiosInstance, AxiosRequestConfig, AxiosResponse }from'axios'import{ Result }from'./types'import{ useUserStore }from'/@/store/modules/user'classHYRequest{privateinstance: AxiosInstanceprivatereadonlyoptions: AxiosRequestConfigconstructor(options: AxiosRequestConfig){this.options = optionsthis.instance = axios.create(options)this.instance.interceptors.request.use((config) =>{consttoken = useUserStore().getTokenif(token) {          config.headers.Authorization =`Bearer${token}`}returnconfig      },(err) =>{returnerr      }    )this.instance.interceptors.response.use((res) =>{// 拦截响应的数据if(res.data.code ===0) {returnres.data.data        }returnres.data      },(err) =>{returnerr      }    )  }  request(config: AxiosRequestConfig):Promise {returnnewPromise((resolve, reject) =>{this.instance        .request>>(config)        .then((res) =>{          resolve((resasunknown)asPromise)        })        .catch((err) =>{          reject(err)        })    })  }  get(config: AxiosRequestConfig):Promise {returnthis.request({ ...config,method:'GET'})  }  post(config: AxiosRequestConfig):Promise {returnthis.request({ ...config,method:'POST'})  }  patch(config: AxiosRequestConfig):Promise {returnthis.request({ ...config,method:'PATCH'})  }delete(config: AxiosRequestConfig):Promise {returnthis.request({ ...config,method:'DELETE'})  }}exportdefaultHYRequest

2.6. VSCode配置

{"workbench.iconTheme":"vscode-great-icons","editor.fontSize":17,"eslint.migration.2_x":"off","[javascript]": {"editor.defaultFormatter":"dbaeumer.vscode-eslint"},"files.autoSave":"afterDelay","editor.tabSize":2,"terminal.integrated.fontSize":16,"editor.renderWhitespace":"all","editor.quickSuggestions": {"strings":true},"debug.console.fontSize":15,"window.zoomLevel":1,"emmet.includeLanguages": {"javascript":"javascriptreact"},"explorer.confirmDragAndDrop":false,"workbench.tree.indent":16,"javascript.updateImportsOnFileMove.enabled":"always","editor.wordWrap":"on","path-intellisense.mappings": {"@":"${workspaceRoot}/src"},"hediet.vscode-drawio.local-storage":"eyIuZHJhd2lvLWNvbmZpZyI6IntcImxhbmd1YWdlXCI6XCJcIixcImN1c3RvbUZvbnRzXCI6W10sXCJsaWJyYXJpZXNcIjpcImdlbmVyYWw7YmFzaWM7YXJyb3dzMjtmbG93Y2hhcnQ7ZXI7c2l0ZW1hcDt1bWw7YnBtbjt3ZWJpY29uc1wiLFwiY3VzdG9tTGlicmFyaWVzXCI6W1wiTC5zY3JhdGNocGFkXCJdLFwicGx1Z2luc1wiOltdLFwicmVjZW50Q29sb3JzXCI6W1wiRkYwMDAwXCIsXCIwMENDNjZcIixcIm5vbmVcIixcIkNDRTVGRlwiLFwiNTI1MjUyXCIsXCJGRjMzMzNcIixcIjMzMzMzM1wiLFwiMzMwMDAwXCIsXCIwMENDQ0NcIixcIkZGNjZCM1wiLFwiRkZGRkZGMDBcIl0sXCJmb3JtYXRXaWR0aFwiOjI0MCxcImNyZWF0ZVRhcmdldFwiOmZhbHNlLFwicGFnZUZvcm1hdFwiOntcInhcIjowLFwieVwiOjAsXCJ3aWR0aFwiOjExNjksXCJoZWlnaHRcIjoxNjU0fSxcInNlYXJjaFwiOnRydWUsXCJzaG93U3RhcnRTY3JlZW5cIjp0cnVlLFwiZ3JpZENvbG9yXCI6XCIjZDBkMGQwXCIsXCJkYXJrR3JpZENvbG9yXCI6XCIjNmU2ZTZlXCIsXCJhdXRvc2F2ZVwiOnRydWUsXCJyZXNpemVJbWFnZXNcIjpudWxsLFwib3BlbkNvdW50ZXJcIjowLFwidmVyc2lvblwiOjE4LFwidW5pdFwiOjEsXCJpc1J1bGVyT25cIjpmYWxzZSxcInVpXCI6XCJcIn0ifQ==","hediet.vscode-drawio.theme":"Kennedy","editor.fontFamily":"Source Code Pro, 'Courier New', monospace","editor.smoothScrolling":true,"editor.formatOnSave":true,"editor.defaultFormatter":"esbenp.prettier-vscode","workbench.colorTheme":"Atom One Dark","vetur.completion.autoImport":false,"security.workspace.trust.untrustedFiles":"open","eslint.lintTask.enable":true,"eslint.alwaysShowStatus":true,"editor.codeActionsOnSave": {"source.fixAll.eslint":true}}

三. 接口文档

https://documenter.getpostman.com/view/12387168/TzsfmQvw

baseURL的值:

http://152.136.185.210:5000

设置全局token的方法:

constres = pm.response.json();pm.globals.set("token", res.data.token);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容