# frontend-tips **Repository Path**: yuekcc/frontend-tips ## Basic Information - **Project Name**: frontend-tips - **Description**: No description available - **Primary Language**: Unknown - **License**: WTFPL - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-29 - **Last Updated**: 2021-08-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## js/ts 篇 ### 声明变量时使用 const、let 全新 es2021 已经发布。再怎么样也应该使用 const/let 声明变量了,而且应该优先使用 const。 虽然现在经过 babel/typescript 转换后都是 var,但是在 eslint/语义层面还是相当有意义的。 ### 优先使用 const 声明变量 const 关键字的好处是变量声明后,不能被再次赋值可以减少一些错误。 ### 变量声明应该尽量初始化 初始化可以减少 null/undefined 问题。 - 数值:0 - 字符串:'' - boolean:false - 数组:[] - 对象(hashmap): {} - 对象(object): null 或具体的初始值 ### 外部接口尽量进行“空”判断 接口数据是不可靠的。因为不是所有人都是面向协议编程。__偷偷修改接口输出结构不是偶发事件__。 ### 异步编程时优先使用 async/await 语法,这些代码会更清晰 async/await 可以将复杂麻烦的回调改写为简单直接的类似于同步的代码,更方便理解、修改。 但是使用 async/await 关键字前,应该先稍微了解一下 Promise 的知识。可以减少一些不必须的 async/await。 ### 工具库应该优先使用 typescript typescript 对比 javascript 主要是改进是引入了一套兼容 javascript 的类型系统。因为兼容的原因也引入了 any。 类型系统的优点是让程序员更好的表达自己的意图,而不是”lucky 编程“。 javascript 是动态类型语言,只是运行的时候才知道变量是什么类型。也就是说,在代码层面,js 中的每一个变量都是一个 黑盒子,只有在最后打开的时候才知道里面是什么东西。 特别是对于一些工具函数、库,使用 typescript 相当于自带了文档。无论是别人或是自己,通过函数签名也更容易知道函数是做了一些什么。 ### 不要利用 js 的隐式类型转换特性编写代码。写清晰好理解的代码,而不是神代码。 ```js const sum = "1" + 100 - (+new Date()) + "1000A" ``` 不是在面试不是在考试,不需要 show 技巧。 ### 时常重构代码 最实用的重构是给变量、方法起一个合适的名字。所谓通过代码解释自己,而不是注释,更不是口口相传。 ### 错误处理 错误处理的地方至少留一行 console.warn,方便追踪。 ## vue 篇 ### 积极使用 @vue/composition-api 特性 `@vue/composition-api` 包可以视为 vue2 过度到 vue3。 ### 非必须不使用 Vue.prototype 挂载对象/方法 `@vue/composition-api` 提供了 provider/inject 可以很方便使用这个功能。另外就是 `@vue/composition-api` 中 `setup` 阶段是不能用 `this` 的。 是时候放弃 `Vue.prototype` 挂载对象/方法的习惯了。 ### 尽量不使用默认导出(export default) 默认导出无 IDE 的智能提示,也不方便重构。编辑的代码跳转功能也可能失效。 ### 自定义的组件导入时,应使用大写 CamelCase html 原生标签全是小写字母。三方库一般是 el-button (事前缀)风格。自定义组件 PageHeader 风格。一目了然。 ### 组件的 props、event 可以加上前缀。方便区分变量、props、原生事件 思考一个问题 @click 和 原生的 onclick 是同一个事件?与其猜或找文档,不如直接在命名上进行区分,也减少了命名冲突。 ### 优先使用 template 而不是 render 函数或者 jsx vue 的 template 中项目构建时会转换为 render 函数。可以自动处理的应该交给机器。template 可以满足 90% 的开发需求。也更为直接。 ### 在 template 中,自定义组件使用 CamelCase 风格。ui 库使用其推荐风格 ```html hello ``` 很明显 `PageHeader` 是自定义组件。`el-button` 是 element-ui 的一个按钮组件。 ### 组件使用实例注册,而不是全局注册 多数情况下,自定义组件是针对特定业务场景制定,复用意义不大。应该对其使用局部注册。被多个组件引用且无具体业务的特性的组件才是公共组件,比如 ui 库的组件。 ### 在 template 中,组件的 props、event 使用 kebab-case ```html ``` ### 控制一个组件的代码量 超过 1000 行的组件应该被拆分。 ### 业务组件更推荐使用 javascript 如上面所说,工具库、公共函数更推荐使用 typescript,但是在写业务的组件时类型安全就变得意义不大。业务组件的特点是要么 n 久不变,要么天天改变。 与其花时间完善业务组件的类型代码,不如花更多时间在需求理解、组件设计、测试上。 ## css 篇 ### 使用 scss scss 似乎比较流行。 ### 使用局部分样式(scoped) 局部样式可以减少样式覆盖问题。不使用 scoped,也可以通过在最外层增加一个前置的样式 class, 控制影响范围。 在一组件中: ```vue ``` 在全局样式中: ```scss .page-header { h1 { // ... } } ``` ### 类命名:kebab-case 例: ```scss .page-title { // ... & h1 { // ... } } ``` ### 需要全局样式修改的情况下,集中在个样式文件中完成 ### 需要样式穿透的,要注意控制影响范围 ## 工程篇 ### 全局使用一种或一套命名风格 **风格没有对错,只有统一和不统一之分**。原则上代码风格应该与世界接轨。对项目好也对自己好。 ### 文件名原则上应该都使用小写字母、-(中划线) windows 系统的文件名不区分大小写,linux 系统区分大小写。全小写可以避免一些无谓的问题。前端更习惯使用 `-` 分割单词。当然如果统一使用 `_` 也是可以的,关键是统一。 不推荐的是使用 camelCase 风格。因为像 userName/username、fileName/filename 这些词语都是简单单词组成,但是在 windows 文件系统下是同一个文件。macos 默认配置的文件系统也是不区分大小写的。但是在 linux 的文件系统中却是两个文件。 ### 文件名可以加上特别后缀,以区分具体功能。 例如:user.service.ts、validate-user.guard.ts 一些常见的后缀: - `service`: 服务 - `guard`: 路由守卫 - `filter`: vue 的过滤器 - `directive`: vue 的自定义指令 > `filter` 可以少用了。vue3 目前是不支持 `filter`。 ### 一个代码文件只用于编写一组紧密相关的函数、一个组件、一个类,甚至一个函数、常量 控制代码的布局。多人协作时,减少冲突。 ### eslint 你值得拥有 js 是动态类型语言。eslint 可以在编写代码时进行一些检查,减少错误。也可以矫正一些不好编程习惯。 **对于提升个人技术**是非常有帮助。 ### prettier 你值得拥有 prettier 是目前流行的代码格式化工具。用户包括 vue 全家、react 全家,还有 n 多 npm 包。prettier 属于强制 风格的工具。所谓“强制风格”就是用户要么全部授受,要么全部不授受。 ### 拼写检查 毕竟英文是外语,有拼写检查起码可以保持单词是正确拼写的。jetbrains 系列是自带功能,vscode 可以 使用 `code spell checker` 插件。 ### 使用 typescript js 是一种动态类型的编程语言。动态类型语言的特点就是不到最后一刻也是不知道这个变量是什么?里面有什么数据。typescript 减少这方面的问题。 ### 只使用一套基础组件库 基础组件库因为涉及大量功能,往往同类型的基础组件库都具有类似的功能。而且经常被全局引用。引用多个基础软件库容易引入奇怪的问题。例如样式覆盖、事件覆盖等。 ### 简化导入(import)路径,使用绝对路径导入 ```ts import { formatDateTime } from '@/shared/utils/format-date-time' import { PageHeader} from '@/components/page-header' ``` 工具类直接指定到具体的文件。vue 组件可以先在组件所在目录中建立一个 index.ts 文件,再引用。绝对路径的好处是 不用人工计算这样的目录:`../../../../xxxx`,而且重构时也会相对方便。 上面的例子,目录实际上是这样的: ``` /src /components /page-header /index.ts /page-header.vue ``` index.ts 代码: ```ts import Component from './page-header.vue'; export const PageHeader = Component; ``` page-header.vue 代码: ```vue ``` 绝对路径引用,需要在构建工具中进行配置,非原生支持。 ### 多 commit、多 push、写有意义的 commit message commit、push 是多人协作开发的第一步。有些情况下做的一个需求内容很多,但也可以拆分多个阶段,每个阶段至少可以进行 一次 commit/push。需求拆分也是熟悉需求的一部分工程。 代码尽快集成也是减少冲突的方法。分次 commit 也更方便使用 git 的 cherry-pick 等特性,制作补丁、回退代码更方便。 ### rebase 而不是 merge 个人分支独立发展一段时间后,可以进行一些 rebase。将自己的变动放置在主干之上,可以减少一些 merge 的 记录。自己的代码也不容易被覆盖。