PageSourceSearch

https://heyingjiee.github.io/assets/docs_frontEngineering_%E9%A1%B…9B%AE%E9%85%8D%E7%BD%AE.md.DtyOmKn4.lean.js

js heyingjiee.github.io collected 2026-10-03 09:17:40 UTC 181,707 bytes, 613 lines download raw bytes

1import{_ as a,c as i,a2 as n,o as p}from"./chunks/framework.CQii86iU.js";const c=JSON.parse('{"title":"前端工程化","description":"","frontmatter":{},"headers":[],"relativePath":"docs/frontEngineering/项目配置.md","filePath":"docs/frontEngineering/项目配置.md","lastUpdated":1748188446000}'),l={name:"docs/frontEngineering/项目配置.md"};function e(t,s,h,k,r,E){return p(),i("div",null,s[0]||(s[0]=[n(`<h1 id="前端工程化" tabindex="-1">前端工程化 <a class="header-anchor" href="#前端工程化" aria-label="Permalink to &quot;前端工程化&quot;">​</a></h1><h2 id="editorconfig" tabindex="-1">EditorConfig <a class="header-anchor" href="#editorconfig" aria-label="Permalink to &quot;EditorConfig&quot;">​</a></h2><p>EditorConfig是编辑器级别的,通过在项目中添加配置文件<code>.editorconfig</code>,EditrConfig插件读取配置文件,并根据配置文件来设置编辑的设置</p><div class="language-editorconfig vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">editorconfig</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>root = true #表示是最顶层的配置文件,设为 true 时,停止向上查找</span></span>
2<span class="line"><span></span></span>
3<span class="line"><span>[*]</span></span>
4<span class="line"><span>charset = utf-8 # 编码字符集</span></span>
5<span class="line"><span>indent_style = space #设置缩进为 tab 或 space 。如果为tab,输入tab变现为为indent_size个空格,实际上是添加制表符;如果为space,会把tab替换为indent_size个空格</span></span>
6<span class="line"><span>indent_size = 2 #设置缩进所占列数</span></span>
7<span class="line"><span>end_of_line = lf #设置换行符,值为lf、cr和crlf</span></span>
8<span class="line"><span>insert_final_newline = true #设为 true 表示使文件以一个空白行结尾</span></span>
9<span class="line"><span>trim_trailing_whitespace = true #设为 true 表示会去除行尾的空白字符</span></span>
10<span class="line"><span></span></span>
11<span class="line"><span>[*.md]</span></span>
12<span class="line"><span>insert_final_newline = false</span></span>
13<span class="line"><span>trim_trailing_whitespace = false</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br></div></div><p>注意:</p><ul><li><p>vscode需要安装插件,才会应用配置文件的规则</p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/20230825174640%20.png" alt="image-20230825174639784"></p></li></ul><h2 id="eslint" tabindex="-1">ESlint <a class="header-anchor" href="#eslint" aria-label="Permalink to &quot;ESlint&quot;">​</a></h2><p>通过使用ESlint对代码质量进行检查(ESLint也有部分配置,是针对于代码风格的)</p><p><a href="https://eslint.nodejs.cn/" target="_blank" rel="noreferrer">ESLint中文网</a></p><h3 id="整体认识" tabindex="-1">整体认识 <a class="header-anchor" href="#整体认识" aria-label="Permalink to &quot;整体认识&quot;">​</a></h3><ul><li><p>ESLint包</p><p>代码质量检查的工具,需要通过npm下载到项目中,通过命令触发代码检查、修复</p></li><li><p>ESLint插件</p><p>依赖于ESlint包(先在项目中安装ESlint包)才能实现其功能。</p><p>Eslint包才具有对代码进行检查的功能,而Eslint插件仅仅是和编译器结合起来,将检查出来的问题在编辑器中做出提示(见下图)等等功能。</p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/20221030162602%20.png" alt="image-20221030162601887"></p><p>我们能够通过编译器对ESlint插件进行设置,调整触发ESLint检查的时机(可以设置保存自动触发)</p></li><li><p>ESLint配置文件</p><p>推荐为下面格式</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span>
13<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span></span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div></li></ul><p>eslint.config.ts eslint.config.js</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span></span></span>
14<span class="line"><span>### 前世今生</span></span>
15<span class="line"><span></span></span>
16<span class="line"><span>ESLint之前有JSLint和JSHint,之所以ESLint能大火是因为 ES6 的出现。ES6 发布后,因为新增了很多语法,JSHint 短期内无法提供支持,而从上面的原理分析,我们就能知道 ESLint 只需要有合适的解析器就能够进行 lint 检查。当时 babel 为 ESLint 提供了支持,开发了 babel-eslint,让ESLint 成为最快支持 ES6 语法的 lint 工具</span></span>
17<span class="line"><span></span></span>
18<span class="line"><span>### 细节学习</span></span>
19<span class="line"><span></span></span>
20<span class="line"><span>* ESLint包</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>npm install -d eslint</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span></span></span>
21<span class="line"><span>安装依赖之后,命令行调用下面的命令即可对指定的文件、目录、匹配项进行ESLint检查和修复</span></span>
22<span class="line"><span></span></span>
23<span class="line"><span>与Prettier一样,通常我们不会选择手动调用,而是集成到 Git Hooks 中,使其成为自动化流程中的一部分。</span></span>
24<span class="line"><span></span></span>
25<span class="line"><span>\`\`\`shell</span></span>
26<span class="line"><span># --fix修复</span></span>
27<span class="line"><span>eslint --fix</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><p>注意:并非所有的ESLint规则,都可以使用--fix修复ï¼
27Œè¯·æŸ¥é˜…<a href="https://eslint.nodejs.cn/docs/latest/rules/" target="_blank" rel="noreferrer">ESLint规则大全</a></p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-20220323185257385%20.png" alt="image-20220323185257385"></p><ul><li><p>ESLint插件</p><p>WebStrom中内置了ESLint插件不必自动安装,但是必须要先安装ESLint包,才能起作用</p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-20220323100746808%20.png" alt="image-20220323100746808"></p><p>另一个重要的设置,这里可以设置WebStrom按照ESLint配置文件进行检查(默认也是这样),如果违反ESLint规则就是在代码中,用波浪线标识出来</p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-20220323102158132%20.png" alt="image-20220323102158132"></p></li></ul><p>ESLint 的底层要素是 语法树(AST) 和 规则(Rules)。ESLint 的内部工作步骤可以概括为:</p><ul><li><p>ESLint 通过解析器(parser,ESLint默认使用的解析器是espress)将源代码解析成语法树(AST)</p></li><li><p>深度遍历 AST,遍历到节点和路径时触发特定的钩子</p></li><li><p>Rule 在钩子上挂载检测逻辑;执行检测逻辑时发现当前语法不符合规范,直接向 ESLint 上报错误信息。</p></li></ul><h3 id="自定义eslint配置" tabindex="-1">自定义ESLint配置 <a class="header-anchor" href="#自定义eslint配置" aria-label="Permalink to &quot;自定义ESLint配置&quot;">​</a></h3><p>重点是 plugin 引入插件,files指定文件类型,然后 rules 是罗列该插件的规则</p><div class="language-ts vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// --------------</span></span>
28<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 1、eslint9.x  extends选项已废弃</span></span>
29<span class="line"></span>
30<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 2、</span></span>
31<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// languageOptions: {  // 这个选项下的配置和具体的解析器相关。</span></span>
32<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     parser: parserVue,  // 同级都是vue 解析器配置</span></span>
33<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     sourceType: &#39;module&#39;,</span></span>
34<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     parserOptions: {</span></span>
35<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//        ecmaFeatures: {</span></span>
36<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//           jsx: true</span></span>
37<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//        },</span></span>
38<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//        extraFileExtensions: [&#39;.vue&#39;],</span></span>
39<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//        parser:parserTS // 同级都是ts解析器的配置</span></span>
40<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     }</span></span>
41<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// },</span></span>
42<span class="line"></span>
43<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 3、插件对象 key ,就是规则的前缀,这个 key 不一定是插件包名,可以是任意的。关闭规则: eslint-disable-next-line ts/no-unused-vars</span></span>
44<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//    但是发现 @eslint/js 官方提供的插件,规则就是 no-debugger 这种没有前缀</span></span>
45<span class="line"></span>
46<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 4、(插件x、插件x内的规则)需要在一个配置对象内,不能跨对象</span></span>
47<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// plugins: {</span></span>
48<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     ts: pluginTS,</span></span>
49<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     vue: pluginVue,</span></span>
50<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//</span></span>
51<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// },</span></span>
52<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// rules: {</span></span>
53<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//   &#39;ts/no-unused-vars&#39;:[&#39;warn&#39;, {argsIgnorePattern: &#39;^_&#39;}],</span></span>
54<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//   &#39;vue/component-name-in-template-casing&#39;: [&#39;error&#39;, &#39;PascalCase&#39;],</span></span>
55<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// }</span></span>
56<span class="line"></span>
57<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// --------------</span></span>
58<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">
58import</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { Linter } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;eslint&#39;</span></span>
59<span class="line"></span>
60<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// eslint 自带的 js 规则 https://www.npmjs.com/package/@eslint/js</span></span>
61<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> js </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@eslint/js&#39;</span></span>
62<span class="line"></span>
63<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// eslint 风格化相关的规则收集到里面</span></span>
64<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> stylisticPlugin </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@stylistic/eslint-plugin&#39;</span></span>
65<span class="line"></span>
66<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// @typescript-eslint/eslint-plugin</span></span>
67<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// ts插件。经过调试发现这个插件导出configs[&#39;flat/recommended&#39;]也是个数组,没法直接取出来 rules</span></span>
68<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pluginTS </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@typescript-eslint/eslint-plugin&#39;</span></span>
69<span class="line"></span>
70<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// @typescript-eslint/parser ts解析器(直接解析 ts、与vue-eslint-parser嵌套使用解析vue 中的ts)</span></span>
71<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 1、配置项 https://typescript-eslint.io/packages/parser/#configuration</span></span>
72<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> parserTS </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@typescript-eslint/parser&#39;</span></span>
73<span class="line"></span>
74<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 鼠标右键调试看下引入的插件的结构。 plugin.configs 如果只有rules直接放到 rules 字段,如果还有其他直接展开</span></span>
75<span class="line"></span>
76<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> unocssConfig </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@unocss/eslint-config/flat&#39;</span></span>
77<span class="line"></span>
78<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// eslint-plugin-vue 文档:https://eslint.vuejs.org/</span></span>
79<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 1、提供 vue-&lt;template&gt;的一些规则</span></span>
80<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pluginVue </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;eslint-plugin-vue&#39;</span></span>
81<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// globals全局变量配置</span></span>
82<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">
82import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> globals </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;globals&#39;</span></span>
83<span class="line"></span>
84<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// export default resConfig;</span></span>
85<span class="line"></span>
86<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// import { Better } from &#39;@baidu/better-core&#39;</span></span>
87<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// import { Linter } from &#39;@baidu/better-plugin-linter&#39;</span></span>
88<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//</span></span>
89<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// const better = new Better().register(</span></span>
90<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//   new Linter({</span></span>
91<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     vue: true,</span></span>
92<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     typescript: true,</span></span>
93<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     unocss: true,</span></span>
94<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     stylistic: true,</span></span>
95<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//     include: [&#39;test-file/**/*&#39;],</span></span>
96<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//   }),</span></span>
97<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// )</span></span>
98<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// const config = await better.apply(&#39;linter&#39;)</span></span>
99<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//</span></span>
100<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// export default config</span></span>
101<span class="line"></span>
102<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// vue-eslint-parser 文档:https://www.npmjs.com/package/vue-eslint-parser</span></span>
103<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 1、解析 vue 文件的 &lt;template&gt; 标签</span></span>
104<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// 2、默认跳过 &lt;script&gt;标签,可以指定 languageOptions.parser 为 ts 解析器(@typescript-eslint/parser提供)</span></span>
105<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">import</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> parserVue </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">from</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;vue-eslint-parser&#39;</span></span>
106<span class="line"></span>
107<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> indent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 2</span></span>
108<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> stylistic</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span></span>
109<span class="line"></span>
110<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> tsRules</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (pluginTS.configs[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;flat/strict&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Linter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[]).</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">reduce</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">cur</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
111<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">  if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (cur.rules) {</span></span>
112<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cur.rules) {</span></span>
113<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">      const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> replacedKey</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> key.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@typescript-eslint/&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;ts/&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
114<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      pre[replacedKey] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cur.rules[key]</span></span>
115<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
116<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  }</span></span>
117<span class="line"></span>
118<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> pre</span></span>
119<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}, {} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;)</span></span>
120<span class="line"></span>
121<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> renameRule</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">options</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
122<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">  rules</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;[]</span></span>
123<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">  origin</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span></span>
124<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">  target</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span></span>
125<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}) {</span></span>
126<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">  const</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">rules</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">origin</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">target</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> } </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> options</span></span>
127<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> rules.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">reduce</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">resultRules</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">rule</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
128<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">    for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> rule) {</span></span>
129<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">      const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> replacedKey</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> key.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(origin, target)</span></span>
130<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      resultRules[replacedKey] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> rule[key]</span></span>
131<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
132<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">    return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> resultRules</span></span>
133<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  }, {} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;)</span></span>
134<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
135<span class="line"></span>
136<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">function</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> composeRulesFromConfigs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">configs</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Linter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[]) {</span></span>
137<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">  return</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> configs.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">reduce</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">((</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">pre</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">cur</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
138<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">    if</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (cur.rules) {</span></span>
139<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">      for</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> key</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> in</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cur.rules) {</span></span>
140<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">        const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> replacedKey</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> key.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">replace</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@typescript-eslint/&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;ts/&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span>
141<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        pre[replacedKey] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> cur.rules[key]</span></span>
142<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      }</span></span>
143<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
144<span class="line"></span>
145<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">    return</span><span style="--shiki-light:#24292E;--shiki-d
145ark:#E1E4E8;"> pre</span></span>
146<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  }, {} </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;)</span></span>
147<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
148<span class="line"></span>
149<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> vueconfig</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
150<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;my/vue&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
151<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  files: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;src/**/*.vue&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
152<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  plugins: {</span></span>
153<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    vue: pluginVue,</span></span>
154<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    ts: pluginTS,</span></span>
155<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
156<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  languageOptions: {</span></span>
157<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    parser: parserVue,</span></span>
158<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    sourceType: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;module&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
159<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    parserOptions: {</span></span>
160<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      ecmaFeatures: {</span></span>
161<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        jsx: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
162<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      },</span></span>
163<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      extraFileExtensions: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;.vue&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
164<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      parser: parserTS,</span></span>
165<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      sourceType: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;module&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
166<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
167<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
168<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  processor: pluginVue.processors[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;.vue&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
169<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  rules: {</span></span>
170<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">    ...</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">composeRulesFromConfigs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(pluginVue.configs[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;flat/recommended&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]),</span></span>
171<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;no-debugger&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
172<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/block-order&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
173<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
174<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      {</span></span>
175<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        order: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;template&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;script&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;style&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
176<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      },</span></span>
177<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    ],</span></span>
178<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/component-name-in-template-casing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;PascalCase&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
179<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/component-options-name-casing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;PascalCase&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
180<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/custom-event-name-casing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;
180camelCase&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
181<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/define-macros-order&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
182<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
183<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      {</span></span>
184<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        order: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;defineOptions&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;defineProps&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;defineEmits&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;defineSlots&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
185<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      },</span></span>
186<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    ],</span></span>
187<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/dot-location&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;property&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
188<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/dot-notation&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, { allowKeywords: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }],</span></span>
189<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/eqeqeq&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;smart&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
190<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/html-indent&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, indent],</span></span>
191<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/html-quotes&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;double&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
192<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/max-attributes-per-line&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;off&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
193<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/multi-word-component-names&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;off&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
194<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-dupe-keys&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;off&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
195<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-empty-pattern&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
196<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-irregular-whitespace&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
197<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-loss-of-precision&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
198<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-restricted-syntax&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
199<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
200<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;DebuggerStatement&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
201<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;LabeledStatement&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
202<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;WithStatement&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
203<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    ],</span></span>
204<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-restricted-v-bind&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;/^v-/&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
205<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-setup-props-reactivity-loss&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;off&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
206<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-sparse-arrays&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
207<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-unused-refs&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
208<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-useless-v-bind&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
209<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/no-v-html&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;off&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
210<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/object-shorthand&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
211<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
212<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
213<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      {</span></span>
214<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        avoidQuotes: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
215<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        ignoreConstructors: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">
215false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
216<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      },</span></span>
217<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    ],</span></span>
218<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/prefer-separate-static-class&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
219<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/prefer-template&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
220<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/prop-name-casing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;camelCase&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
221<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/require-default-prop&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;off&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
222<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/require-prop-types&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;off&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
223<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/space-infix-ops&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
224<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;vue/space-unary-ops&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, { nonwords: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, words: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }],</span></span>
225<span class="line"></span>
226<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">    ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(stylistic</span></span>
227<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">      ?</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
228<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/array-bracket-spacing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;never&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
229<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/arrow-spacing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
229, { after: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, before: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }],</span></span>
230<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/block-spacing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
231<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/block-tag-newline&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
232<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">            &#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
233<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">            {</span></span>
234<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">              multiline: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
235<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">              singleline: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
236<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">            },</span></span>
237<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">          ],</span></span>
238<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/brace-style&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
239<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">            &#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
240<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">            &#39;stroustrup&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
241<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">            { allowSingleLine: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
242<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">          ],</span></span>
243<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/comma-dangle&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always-multiline&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
244<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/comma-spacing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, { after: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, before: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }],</span></span>
245<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/comma-style&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;last&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
246<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/html-comment-content-spacing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
247<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">            &#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
248<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">            &#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
249<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">            {</span></span>
250<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">              exceptions: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;-&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
251<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">            },</span></span>
252<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">          ],</span></span>
253<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/key-spacing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
254<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">            &#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
255<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">            { afterColon: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, beforeColon: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">
255false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
256<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">          ],</span></span>
257<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/keyword-spacing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, { after: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, before: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }],</span></span>
258<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/object-curly-newline&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;off&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
259<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/object-curly-spacing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
260<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/object-property-newline&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
261<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">            &#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
262<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">            { allowMultiplePropertiesPerLine: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> },</span></span>
263<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">          ],</span></span>
264<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/operator-linebreak&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;before&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
265<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/padding-line-between-blocks&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
266<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/quote-props&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;consistent-as-needed&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
267<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/space-in-parens&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;never&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
268<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">          &#39;vue/template-curly-spacing&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
269<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        }</span></span>
270<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">      :</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {}),</span></span>
271<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
272<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
273<span class="line"></span>
274<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">const</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> stylisticRules</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> renameRule</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
274({</span></span>
275<span class="line"></span>
276<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  rules: [stylisticPlugin.configs.recommended.rules</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">!</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
277<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  origin: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@stylistic/&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
278<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  target: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;stylistic/&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
279<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">})</span></span>
280<span class="line"></span>
281<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span></span>
282<span class="line"></span>
283<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  {</span></span>
284<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;my/global&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
285<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    languageOptions: {</span></span>
286<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      ecmaVersion: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2022</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
287<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      globals: {</span></span>
288<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">        ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">globals.browser,</span></span>
289<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">        ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">globals.es2021,</span></span>
290<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">        ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">globals.node,</span></span>
291<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        document: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;readonly&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
292<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        navigator: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;readonly&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
293<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        window: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;readonly&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
294<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      },</span></span>
295<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      parserOptions: {</span></span>
296<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        ecmaFeatures: {</span></span>
297<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">          jsx: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
298<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        },</span></span>
299<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        ecmaVersion: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2022</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
300<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        sourceType: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;module&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
301<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      },</span></span>
302<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      sourceType: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;module&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
303<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
304<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    linterOptions: {</span></span>
305<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      reportUnusedDisableDirectives: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
306<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
307<span class="line"></span>
308<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
309<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  {</span></span>
310<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;my/ts&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
311<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    files: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;**/*.?([cm])tsx&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;**/*.ts&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;**/*.vue&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
312<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    plugins: {</span></span>
313<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      ts: pluginTS,</span></span>
314<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
315<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    languageOptions: {</span></span>
316<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      parser: parserTS,</span></span>
317<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      sourceType: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;module&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
318<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
319<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    rules: {</span></span>
320<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;no-debugger&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
321<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">      ...</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">composeRulesFromConfigs</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(pluginTS.configs[</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;flat/strict&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">as</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Linter</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Config</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[]),</span></span>
322<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
323<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
324<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  {</span></span>
325<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;my/js&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
326<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    files: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;**/*.?([cm])jsx&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;src/**/*.js&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
327<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    plugins: {</span></span>
328<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      js,</span></span>
329<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
330<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    rules: {</span></span>
331<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">      ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">js.configs.recommended.rules,</span></span>
332<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
333<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
334<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  {</span></span>
335<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;
335my/unocss&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
336<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">    ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">unocssConfig,</span></span>
337<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
338<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  // ...(pluginTS.configs[&#39;flat/recommended&#39;] as Linter.Config[]),</span></span>
339<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  vueconfig,</span></span>
340<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  // ...pluginVue.configs[&#39;flat/recommended&#39;],</span></span>
341<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  {</span></span>
342<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    name: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;my/stylistic&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
343<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">    // ...stylisticPlugin.configs.recommended,</span></span>
344<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    plugins: {</span></span>
345<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      stylistic: stylisticPlugin,</span></span>
346<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
347<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    rules: {</span></span>
348<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">      ...</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">stylisticRules,</span></span>
349<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;stylistic/semi&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
350<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &#39;stylistic/indent&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;error&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">4</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
351<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
352<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
353<span class="line"></span>
354<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">
35453</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br><span class="line-number">94</span><br><span class="line-number">95</span><br><span class="line-number">96</span><br><span class="line-number">97</span><br><span class="line-number">98</span><br><span class="line-number">99</span><br><span class="line-number">100</span><br><span class="line-number">101</span><br><span class="line-number">102</span><br><span class="line-number">103</span><br><span class="line-number">104</span><br><span class="line-number">105</span><br><span class="line-number">106</span><br><span class="line-number">107</span><br><span class="line-number">108</span><br><span class="line-number">109</span><br><span class="line-number">110</span><br><span class="line-number">111</span><br><span class="line-number">112</span><br><span class="line-number">113</span><br><span class="line-number">114</span><br><span class="line-number">115</span><br><span class="line-number">116</span><br><span class="line-number">117</span><br><span class="line-number">118</span><br><span class="line-number">119</span><br><span class="line-number">120</span><br><span class="line-number">121</span><br><span class="line-number">122</span><br><span class="line-number">123</span><br><span class="line-number">124</span><br><span class="line-number">125</span><br><span class="line-number">126</span><br><span class="line-number">127</span><br><span class="line-number">128</span><br><span class="line-number">129</span><br><span class="line-number">130</span><br><span class="line-number">131</span><br><span class="line-number">132</span><br><span class="line-number">133</span><br><span class="line-number">134</span><br><span class="line-number">135</span><br><span class="line-number">136</span><br><span class="line-number">137</span><br><span class="line-number">138</span><br><span class="line-number">139</span><br><span class="line-number">140</span><br><span class="line-number">141</span><br><span class="line-number">142</span><br><span class="line-number">143</span><br><span class="line-number">144</span><br><span class="line-number">145</span><br><span class="line-number">146</span><br><span class="line-number">147</span><br><span class="line-number">148</span><br><span class="line-number">149</span><br><span class="line-number">150</span><br><span class="line-number">151</span><br><span class="line-number">152</span><br><span class="line-number">153</span><br><span class="line-number">154</span><br><span class="line-number">155</span><br><span class="line-number">156</span><br><span class="line-number">157</span><br><span class="line-number">158</span><br><span class="line-number">159</span><br><span class="line-number">160</span><br><span class="line-number">161</span><br><span class="line-number">162</span><br><span class="line-number">163</span><br><span class="line-number">164</span><br><span class="line-number">165</span><br><span class="line-number">166</span><br><span class="line-number">167</span><br><span class="line-number">168</span><br><span class="line-number">169</span><br><span class="line-number">170</span><br><span class="line-number">171</span><br><span class="line-number">172</span><br><span class="line-number">173</span><br><span class="line-number">174</span><br><span class="line-number">175</span><br><span class="line-number">176</span><br><span class="line-number">177</span><br><span class="line-number">178</span><br><span class="line-number">179</span><br><span class="line-number">180</span><br><span class="line-number">181</span><br><span class="line-number">182</span><br><span class="line-number">183</span><br><span class="line-number">184</span><br><span class="line-number">185</span><br><span class="line-number">186</span><br><span class="line-number">187</span><br><span class="line-number">188</span><br><span class="line-number">189</span><br><span class="line-number">190</span><br><span class="line-number">191</span><br><span class="line-number">192</span><br><span class="line-number">193</span><br><span class="line-number">
354194</span><br><span class="line-number">195</span><br><span class="line-number">196</span><br><span class="line-number">197</span><br><span class="line-number">198</span><br><span class="line-number">199</span><br><span class="line-number">200</span><br><span class="line-number">201</span><br><span class="line-number">202</span><br><span class="line-number">203</span><br><span class="line-number">204</span><br><span class="line-number">205</span><br><span class="line-number">206</span><br><span class="line-number">207</span><br><span class="line-number">208</span><br><span class="line-number">209</span><br><span class="line-number">210</span><br><span class="line-number">211</span><br><span class="line-number">212</span><br><span class="line-number">213</span><br><span class="line-number">214</span><br><span class="line-number">215</span><br><span class="line-number">216</span><br><span class="line-number">217</span><br><span class="line-number">218</span><br><span class="line-number">219</span><br><span class="line-number">220</span><br><span class="line-number">221</span><br><span class="line-number">222</span><br><span class="line-number">223</span><br><span class="line-number">224</span><br><span class="line-number">225</span><br><span class="line-number">226</span><br><span class="line-number">227</span><br><span class="line-number">228</span><br><span class="line-number">229</span><br><span class="line-number">230</span><br><span class="line-number">231</span><br><span class="line-number">232</span><br><span class="line-number">233</span><br><span class="line-number">234</span><br><span class="line-number">235</span><br><span class="line-number">236</span><br><span class="line-number">237</span><br><span class="line-number">238</span><br><span class="line-number">239</span><br><span class="line-number">240</span><br><span class="line-number">241</span><br><span class="line-number">242</span><br><span class="line-number">243</span><br><span class="line-number">244</span><br><span class="line-number">245</span><br><span class="line-number">246</span><br><span class="line-number">247</span><br><span class="line-number">248</span><br><span class="line-number">249</span><br><span class="line-number">250</span><br><span class="line-number">251</span><br><span class="line-number">252</span><br><span class="line-number">253</span><br><span class="line-number">254</span><br><span class="line-number">255</span><br><span class="line-number">256</span><br><span class="line-number">257</span><br><span class="line-number">258</span><br><span class="line-number">259</span><br><span class="line-number">260</span><br><span class="line-number">261</span><br><span class="line-number">262</span><br><span class="line-number">263</span><br><span class="line-number">264</span><br><span class="line-number">265</span><br><span class="line-number">266</span><br><span class="line-number">267</span><br><span class="line-number">268</span><br><span class="line-number">269</span><br><span class="line-number">270</span><br><span class="line-number">271</span><br><span class="line-number">272</span><br><span class="line-number">273</span><br><span class="line-number">274</span><br><span class="line-number">275</span><br><span class="line-number">276</span><br><span class="line-number">277</span><br><span class="line-number">278</span><br><span class="line-number">279</span><br><span class="line-number">280</span><br><span class="line-number">281</span><br><span class="line-number">282</span><br><span class="line-number">283</span><br><span class="line-number">284</span><br><span class="line-number">285</span><br><span class="line-number">286</span><br><span class="line-number">287</span><br><span class="line-number">288</span><br><span class="line-number">289</span><br><span class="line-number">290</span><br><span class="line-number">291</span><br><span class="line-number">292</span><br><span class="line-number">293</span><br><span class="line-number">294</span><br><span class="line-number">295</span><br><span class="line-number">296</span><br><span class="line-number">297</span><br><span class="line-number">298</span><br><span class="line-number">299</span><br><span class="line-number">300</span><br><span class="line-number">301</span><br><span class="line-number">302</span><br><span class="line-number">303</span><br><span class="line-number">304</span><br><span class="line-number">305</span><br><span class="line-number">306</span><br><span class="line-number">307</span><br><span class="line-number">308</span><br><span class="line-number">309</span><br><span class="line-number">310</span><br><span class="line-number">311</span><br><span class="line-number">312</span><br><span class="line-number">313</span><br><span class="line-number">314</span><br><span class="line-number">315</span><br><span class="line-number">316</span><br><span class="line-number">317</span><br><span class="line-number">318</span><br><span class="line-number">319</span><br><span class="line-number">320</span><br><span class="line-number">321</span><br><span class="line-number">322</span><br><span class="line-number">323</span><br><span class="line-number">324</span><br><span class="line-number">325</span><br><span class="line-number">326</span><br><span class="line-number">327</span><br><span class="line-number">
354328</span><br></div></div><h2 id="工作流自动化集成" tabindex="-1">工作流自动化集成 <a class="header-anchor" href="#工作流自动化集成" aria-label="Permalink to &quot;工作流自动化集成&quot;">​</a></h2><h3 id="git-hooks" tabindex="-1">Git Hooks <a class="header-anchor" href="#git-hooks" aria-label="Permalink to &quot;Git Hooks&quot;">​</a></h3><p>Git预先定义了一些事件钩子,如<code>commit-msg</code>、<code>pre-commit</code>等,当我们执行对应的Git操作时会触发它们,然后项目根目录下的.git/hooks 目录中对应的脚本就会执行,如图所示:</p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-20220323191501634%20.png" alt="image-20220323191501634"></p><p>默认情况下,这里shell脚本都是<code>.sample</code>结尾的,所以我们执行对应的Git操作时,并不会触发对应的脚本执行。我们可以将<code>.sample</code>结尾去掉,就会触发执行,其中的shell脚本了。同时,我们可以编写shell脚本,就能让Git触发勾子事件时,按照我们要求去执行任务了</p><p>但前端工程师大多对linux/windows shell并不擅长, 因此我们通过编写git hooks脚本来优化前端工作流的这条道路十分艰难。但是,Nodejs的出现改变了这一切,它让JS拥有了控制“操作系统”的能力,你只需要安装npm包<a href="https://link.zhihu.com/?target=https%3A//www.npmjs.com/package/husky" target="_blank" rel="noreferrer">husky</a>,它会帮我们自动生成.git/hooks目录下的shell script,我们便可以很轻松的使用更熟悉的JS处理git hooks任务,而无需关注shell脚本的实现细节</p><p>图中,<code>pre-commit</code>文件之所以,没有<code>.sample</code>结尾,就是我安装了husky包,然后在package中配置触发的任务后,husky自动帮我生成脚本放入其中,并去掉<code>.sample</code></p><h4 id="husky旧版本" tabindex="-1">husky旧版本 <a class="header-anchor" href="#husky旧版本" aria-label="Permalink to &quot;husky旧版本&quot;">​</a></h4><p><strong>安装husky</strong></p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> [email protected]</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><strong>package.json中配置husky</strong></p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;scripts&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
355<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;test&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;node test.js&quot;</span></span>
356<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">},</span></span>
357<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;husky&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
358<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;hooks&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
359<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">      // 可以执行一个js文件,将控制权转移给我们更熟悉的nodejs</span></span>
360<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">      &quot;pre-commit&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;node test.js&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span></span>
361<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">      // 也可以调用其他脚本或者执行一段原生shell命令</span></span>
362<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">      &quot;commit-msg&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;npm run test &amp;&amp; echo succeed&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
363<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      </span></span>
364<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
365<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div><p>常用下面的方式集成钩子</p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span>
365<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;husky&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
366<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;hooks&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
367<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">      &quot;commit-msg&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;commitlint -E HUSKY_GIT_PARAMS&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
368<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">      &quot;pre-commit&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;lint-staged&quot;</span></span>
369<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
370<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><h4 id="husky新版本" tabindex="-1">husky新版本 <a class="header-anchor" href="#husky新版本" aria-label="Permalink to &quot;husky新版本&quot;">​</a></h4><p>新版本引入破坏性变动,使用方式和旧版本有较大出入</p><p>新版不在使用默认的<code>.git/hooks</code>目录存储脚本,而是指定了项目内的文件夹为脚本目录</p><p><strong>安装husky</strong></p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> husky</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><strong>package.json中添加</strong></p><p>prepare脚本会在<code>npm install</code>(不带参数)之后自动执行</p><p>当我们执行npm install安装完项目依赖后会执行 <code>husky install</code>命令,该命令会在当前目录创建.husky/目录并指定该目录为git hooks所在的目录。【默认git hooks目录在.git/hooks下,这个目录是不会被提交到仓库的】</p><p>如果不添加为prepare脚本,即使.husky文件夹被提交到git仓库,其他人在clone项目后ï¼
370Œæœ¬åœ°çš„git不会将Git钩子的目录指定为项目中的.husky目录</p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-20220324180608409%20.png" alt="image-20220324180608409"></p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//手动在package.json中添加</span></span>
371<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
372<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">  &quot;scripts&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
373<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;prepare&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;husky install&quot;</span></span>
374<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  }</span></span>
375<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span>
376<span class="line"></span>
377<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//使用npm命令添加</span></span>
378<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">npm set-script prepare </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;husky install&quot;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br></div></div><p><strong>添加git hooks</strong></p><p><code>husky add</code>:第一个参数是在.husky目录下新建的文件名,第二个参数是文件中的写入的脚本</p><p>在.husky目录下新建pre-commit脚本,</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> husky</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .husky/pre-commit</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;npx lint-staged&quot;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-20220327171214174.png" alt="image-20220327171214174"></p><p>在.husky目录下新建commit-msg脚本</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> husky</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .husky/commit-msg</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;npx --no-install commitlint --edit </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">$1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span></span>
379<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">#--no-install 参数表示强制npx使用项目中node_modules目录中的commitlint包</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-20220327171056231.png" alt="image-20220327171056231"></p><p>这里提到的,在脚本中添加的几个命令,会在后面提到</p><h3 id="lint-staged" tabindex="-1">lint-staged <a class="header-anchor" href="#lint-staged" aria-label="Permalink to &quot;lint-staged&quot;">​</a></h3><p>Git Hooks可以让我们在提交流程中触发自定义操作,完成各种工作的自动化集成。</p><p>通常情况下,我们只需要对自己的本次提交变更的代码,进行各种校验或修复</p><p>lint-staged就能完成这样的任务,可以让我们的操作只针对于暂存区的代码</p><p><strong>安装</strong></p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span>
379<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> lint-staged</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p><strong>配置</strong></p><p>基本格式</p><div class="language- vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang"></span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>&quot;lint-staged&quot;: {</span></span>
380<span class="line"><span>    &quot;文件格式&quot;: [</span></span>
381<span class="line"><span>      &quot;命令1&quot;,</span></span>
382<span class="line"><span>      &quot;命令2&quot;,</span></span>
383<span class="line"><span>      &quot;...其他命令&quot;</span></span>
384<span class="line"><span>    ]</span></span>
385<span class="line"><span>}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br></div></div><p>例子:对暂存区中的js、jsx、vue文件,使用eslint修复命令。因为eslint修复后,代码可能会出现变化,这些可能出现的变化放自动放入到暂存区</p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;lint-staged&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
386<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;*.{js,jsx,vue}&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
387<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &quot;eslint --fix --ext .js app/&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
388<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    ]</span></span>
389<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><h3 id="集成commitlint" tabindex="-1">集成commitlint <a class="header-anchor" href="#集成commitlint" aria-label="Permalink to &quot;集成commitlint&quot;">​</a></h3><p>规范化提交,更便于在仓库中查找某次提交</p><p>可以直接用规范化的commit message生成change log</p><p><a href="https://commitlint.js.org/#/" target="_blank" rel="noreferrer">commitlint官方网站</a></p><ul><li><p>安装</p><ul><li><p>@commitlint/cli 是commitlint提供的命令行工具,安装后会将cli脚本放置在./node_modules/.bin/目录下</p></li><li><p>@commitlint/config-conventional是社区中一些共享的配置,我们可以扩展这些配置,也可以不安装这个包自定义配置</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @commitlint/cli</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
390<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> @commitlint/config-conventional</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div></li></ul></li><li><p>提交规范</p><p>commit message 由 <code>header</code>(必须) 、<code>body</code>(可选)、<code>footer</code>(可选)</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span>
390<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>&lt;type&gt;[scope]: &lt;subject&gt;</span></span>
391<span class="line"><span>[body]</span></span>
392<span class="line"><span>[footer]</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><ul><li><p><strong>header</strong></p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>&lt;type&gt;[scope]: &lt;subject&gt;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>type:表示提交的类型,<code>@commitlint/config-conventional</code>中包含的可选值有</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>feat: 新功能</span></span>
393<span class="line"><span></span></span>
394<span class="line"><span>fix: bug 修复</span></span>
395<span class="line"><span></span></span>
396<span class="line"><span>docs: 仅修改文档</span></span>
397<span class="line"><span></span></span>
398<span class="line"><span>style: 修改格式(空格,格式化,省略分号等),对代码运行没有影响</sp
398an></span>
399<span class="line"><span></span></span>
400<span class="line"><span>refactor: 重构(既不是修 bug ,也不是加功能)</span></span>
401<span class="line"><span></span></span>
402<span class="line"><span>build: 构建流程、外部依赖变更,比如升级 npm 包、修改 webpack 配置等</span></span>
403<span class="line"><span></span></span>
404<span class="line"><span>perf: 性能优化</span></span>
405<span class="line"><span></span></span>
406<span class="line"><span>test: 测试相关</span></span>
407<span class="line"><span></span></span>
408<span class="line"><span>chore: 对构建过程或辅助工具和库(如文档生成)的更改</span></span>
409<span class="line"><span></span></span>
410<span class="line"><span>ci: ci 相关的更改</span></span>
411<span class="line"><span></span></span>
412<span class="line"><span>revert: 当前提交是为了撤销之前的某次提交,应该用 revert 开头,后面加上被撤销的提交的 header,在 body 中应该注明:This reverts commit &lt;hash&gt;. ,hash 指的就是将要被撤销的 commit SHA </span></span>
413<span class="line"><span>// 例如</span></span>
414<span class="line"><span>revert: feat(user): add user type</span></span>
415<span class="line"><span>This reverts commit ca16a365467e17915f0273392f4a13331b17617d.</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br></div></div><p>scope:表示本次提交代码的影响的范围</p><p>subject:表示对本次提交代码的简短描述</p></li><li><p><strong>body</strong></p><p>body 部分是对本地 commit 的详细描述,可以分成多行</p></li><li><p><strong>footer</strong></p><p>基本用在这两种情况:</p><ul><li><p>不兼容的改动( Breaking Changes ),通常用 BREAKING CHANGE: 开头,后面跟一个空格或两个换行符。剩余的部分就是用来说明这个变动的信息和迁移方法等。</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">refactor:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
416<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">BREAKING</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> CHANGE:某某发生了更改</span></span>
417<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">    按照下面的例子迁移代码:</span></span>
418<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">    Before:</span></span>
419<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">    scope:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> {</span></span>
420<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">      myAttr:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;attribute&#39;,</span></span>
421<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">      myBind:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;bind&#39;,</span></span>
422<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">      myExpression:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;expression&#39;</span></span>
423<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
424<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">    After:</span></span>
425<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">    scope:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> {</span></span>
426<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">      myAttr:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@&#39;,</span></span>
427<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">      myBind:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;@&#39;,</span></span>
428<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">      myExpression:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;&amp;&#39;</span></span>
429<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
430<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">    某某发生了更改</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br></div></div></li><li><p>关闭 Issue(Closes #Issue号)</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span>
430<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">fix:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> 修复用户登陆注册</span></span>
431<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Closes</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> #2314, #3421</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div></li></ul></li></ul></li><li><p>初始化@commitlint/cli的配置文件</p><p>项目根目录下,创建<code>commitlint.config.js</code>文件,也可以是<code>.commitlintrc.js</code></p><p><strong>官网给出的配置文件完整的格式</strong></p><div class="language-js vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
432<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  /*</span></span>
433<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Resolve and load @commitlint/config-conventional from node_modules.</span></span>
434<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Referenced packages must be installed</span></span>
435<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   */</span></span>
436<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  extends: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@commitlint/config-conventional&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
437<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  /*</span></span>
438<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Resolve and load conventional-changelog-atom from node_modules.</span></span>
439<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Referenced packages must be installed</span></span>
440<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   */</span></span>
441<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  parserPreset: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;conventional-changelog-atom&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
442<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  /*</span></span>
443<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Resolve and load @commitlint/format from node_modules.</span></span>
444<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Referenced package must be installed</span></span>
445<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   */</span></span>
446<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  formatter: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@commitlint/format&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
447<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  /*</span></span>
448<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Any rules defined here will override rules from @commitlint/config-conventional</span></span>
449<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   */</span></span>
450<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  rules: {</span></span>
451<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;type-enum&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
451, [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;foo&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]],</span></span>
452<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
453<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  /*</span></span>
454<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Functions that return true if commitlint should ignore the given message.</span></span>
455<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   */</span></span>
456<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  ignores: [(</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">commit</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> commit </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">===</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
457<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  /*</span></span>
458<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Whether commitlint uses the default ignore rules.</span></span>
459<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   */</span></span>
460<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  defaultIgnores: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
461<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  /*</span></span>
462<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Custom URL to show upon failure</span></span>
463<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   */</span></span>
464<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  helpUrl:</span></span>
465<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">    &#39;https://github.com/conventional-changelog/commitlint/#what-is-commitlint&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
466<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  /*</span></span>
467<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   * Custom prompt configs</span></span>
468<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">   */</span></span>
469<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  prompt: {</span></span>
470<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    messages: {},</span></span>
471<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    questions: {</span></span>
472<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      type: {</span></span>
473<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        description: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;please input type:&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
474<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      },</span></span>
475<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    },</span></span>
476<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
477<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">};</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br></div></div><p><strong>通常我们使用第一步安装的第三方配置就可以了</strong></p><div class="language-js vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span>
477<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/*使用第一步安装的第三方配置*/</span></span>
478<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
479<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    extends: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@commitlint/config-conventional&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
480<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p><strong>如果想要自定义一些配置</strong></p><div class="language-js vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
481<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    extends: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@commitlint/config-conventional&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
482<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  	/*可以在下面,继续写其他字段的配置,这些配置会覆盖@commitlint/config-conventional中对应的配置*/</span></span>
483<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br></div></div><p>比如Rules,按照官网的<a href="https://commitlint.js.org/#/reference-rules" target="_blank" rel="noreferrer">Rules</a>字段配置,这里我们讲下配置的格式</p><div class="language-text vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">text</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>&#39;规则名&#39;:[Level,Applicable,Value]</span></span>
484<span class="line"><span></span></span>
485<span class="line"><span>//规则名:从官网查到所有的规则名的第一部分都是commit message的不同部分,例如:header-* 、scope-* 、type-*,表示规则作用的部分</span></span>
486<span class="line"><span>//Level : 错误提示等级,0是关闭提示,1是警告提示,2是错误提示</span></span>
487<span class="line"><span>//Applicable : always启用规则,never关闭规则</span></span>
488<span class="line"><span>//Value : 有些规则需要传递参数,在这里传递,比如 &#39;header-max-length&#39;: [2, &#39;always&#39;, 72] 表示 header最长72</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>例子:覆盖<code>@commitlint/config-conventional</code>中的rules字段</p><div class="language-js vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">js</span>
488<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/**</span></span>
489<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * feature:新功能</span></span>
490<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * update:更新某功能</span></span>
491<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * fixbug:修补某功能的bug</span></span>
492<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * refactor:重构某个功能</span></span>
493<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * optimize: 优化构建工具或运行时性能</span></span>
494<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * style:仅样式改动</span></span>
495<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * docs:仅文档新增/改动</span></span>
496<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * chore:构建过程或辅助工具的变动</span></span>
497<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
498<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">module</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">exports</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
499<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    extends: [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;@commitlint/config-conventional&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">],</span></span>
500<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  	</span></span>
501<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  	/*自定义配置,会覆盖@commitlint/config-conventional中的配置*/</span></span>
502<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    rules: {</span></span>
503<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      	&#39;header-max-length&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;never&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">72</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">], </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// header 最长72</span></span>
504<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">      </span></span>
505<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">        &#39;body-leading-blank&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">], </span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">// body换行</span></span>
506<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">        </span></span>
507<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">      	//type的枚举字段,提交时的type值,只能是这里的值,@commitlint/config-conventional中的可选值全部被覆盖了</span></span>
508<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">        &#39;type-enum&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;always&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">
508, [</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;feature&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;update&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;fixbug&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;refactor&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;optimize&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;style&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;docs&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&#39;chore&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]],</span></span>
509<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
510<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br></div></div></li><li><p>添加到Git钩子中</p><p>旧版husky</p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//package.json文件中</span></span>
511<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;husky&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
512<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;hooks&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
513<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">      &quot;commit-msg&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;commitlint -E HUSKY_GIT_PARAMS&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
514<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
515<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br></div></div><p>新版husky(参照上面Git Hooks章节的使用)</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span>
515<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> husky</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .husky/commit-msg</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;npx --no-install commitlint --edit </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">$1</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;</span></span>
516<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">#--no-install 参数表示强制npx使用项目中node_modules目录中的commitlint包</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div></li><li><p>lint-staged</p><p>这里仅仅是校验commit message,不是暂存区代码,所以不必使用lint-staged</p></li><li><p>提交</p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-20220328142551798.png" alt="image-20220328142551798"></p></li><li><p>编写commit message的辅助工具</p><p>commitzen是一款工具,可以通过在终端选择的方式,帮助我们编写合格的commit message</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> commitizen</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>让commitzen其支持 Angular 的 Commit message 格式</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">commitizen</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> init</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> cz-conventional-changelog</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> --save-exact</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>查看package.json,就会多出一句</p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;config&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
517<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">	&quot;commitizen&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
518<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">		&quot;path&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;./node_modules/cz-conventional-changelog&quot;</span></span>
519<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">   }</span></span>
520<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br></div></div><p>以后,凡是用到<code>git commit</code>命令,一律改为使用<code>git cz</code>。这时,就会出现选项</p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-202203292033
52004247.png" alt="image-20220329203304247"></p></li></ul><h3 id="集成changelog" tabindex="-1">集成Changelog <a class="header-anchor" href="#集成changelog" aria-label="Permalink to &quot;集成Changelog&quot;">​</a></h3><p>如果你的所有 Commit 都符合 Angular 格式,那么发布新版本时, Change log 就可以用脚本自动生成</p><p>生成的文档包括以下三个部分。</p><blockquote><ul><li>New features</li><li>Bug fixes</li><li>Breaking changes.</li></ul></blockquote><p>每个部分都会罗列相关的 commit ,并且有指向这些 commit 的链接。当然,生成的文档允许手动修改,所以发布前,你还可以添加其他内容</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> conventional-changelog-cli</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>生成CHANGELOG.md文件</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">conventional-changelog</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> angular</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> CHANGELOG.md</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -w</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> #命令不会覆盖以前的 Change log,只会在CHANGELOG.md的头部加上自从上次发布以来的变动</span></span>
521<span class="line"></span>
522<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">conventional-changelog</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -p</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> angular</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -i</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> CHANGELOG.md</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -w</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -r</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 0</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> #生成所有的 Change log,要改为运行下面的命令</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><p>文件的格式大概是下面这个样子</p><p><img src="https://hedaodao-1256075778.cos.ap-beijing.myqcloud.com/Essay/image-20220329210029744.png" alt="image-20220329210029744"></p><p>集成到package.json的脚本中</p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">scripts: {</span></span>
523<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">   &quot;changelog&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;conventional-changelog -p angular -i CHANGELOG.md -s -r 0 &amp;&amp; git add CHANGELOG.md&quot;</span></span>
524<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br></div></div><h3 id="集成prettier" tabindex="-1">集成Prettier <a class="header-anchor" href="#集成prettier" aria-label="Permalink to &quot;集成Prettier&quot;">​</a></h3><p>一般情况下,我们并不会把Prettier集成到自动化流程中</p><p>因为,如果我们对项目中其他人的页面进行修改,在提交时自动触发Prettier格式化,可能会将页面中其他人的代码格式化,这样在提交记录上来看,其他人的代码,变成了自己提交的代码</p><ul><li><p>安装</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span>
524<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -D</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> prettier</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div></li><li><p>根目录下新建配置文件<code>prettierrc</code></p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
525<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;printWidth&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">80</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span></span>
526<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;tabWidth&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">2</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span></span>
527<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;useTabs&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span></span>
528<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;semi&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
529<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;singleQuote&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">false</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span></span>
530<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;bracketSpacing&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span></span>
531<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;bracketSameLine&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">true</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span></span>
532<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;endOfLine&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;lf&quot;</span></span>
533<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br></div></div></li><li><p>package.json中配置</p><p>这里仅仅是暂存区的文件需要进行Prettier格式化,所以使用了lint-staged</p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span>
533<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">{</span></span>
534<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">	 &quot;scripts&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
535<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;prettier&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;prettier --write&quot;</span></span>
536<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  },</span></span>
537<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  </span></span>
538<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">  &quot;lint-staged&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
539<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;*.{js,vue}&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: [</span></span>
540<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &quot;npm run prettier&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
541<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &quot;git add&quot;</span></span>
542<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    ]</span></span>
543<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  }</span></span>
544<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br></div></div></li><li><p>添加Git Hooks</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npx</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> husky</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> add</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .husky/pre-commit</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &quot;npx lint-staged&quot;</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div></li></ul><p>Git官网介绍了,所有的<a href="https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90" target="_blank" rel="noreferrer">Git勾子</a>的详细信息</p><p>流程:</p><ul><li>Git Hooks在Git提交的某个阶段触发的勾子</li><li>勾子中使用lint-staged,使得格式化工具只作用于暂存区代码</li></ul><p>自动化,只会用到<strong>提交工作流钩子</strong>,提交工作流包含 4 个钩子:</p><div class="language-flow vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">flow</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>st=&gt;start: git commit -m &quot;提交文本&quot;</span></span>
545<span class="line"><span>op1=&gt;operation: pre-commit</span></span>
546<span class="line"><span>op2=&gt;operation: prepare-commit-msg</span></span>
547<span class="line"><span>op3=&gt;operation: commit-msg</span></span>
548<span class="line"><span>op4=&gt;operation: post-commit</span></span>
549<span class="line"><span>e=&gt;
549end: 提交完成</span></span>
550<span class="line"><span>st-&gt;op1-&gt;op2-&gt;op3-&gt;op4</span></span>
551<span class="line"><span>op4-&gt;e</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br></div></div><ul><li><p><code>pre-commit</code> 钩子在键入提交信息前运行,在这个阶段加入 <strong>代码检查</strong> 流程,会代码</p></li><li><p><code>prepare-commit-msg</code> 钩子在启动提交信息编辑器之前,默认信息被创建之后运行。它对一般的提交来说并没有什么用;然而对那些会自动产生默认信息的提交,如提交信息模板、合并提交、压缩提交和修订提交等非常实用。 你可以结合提交模板来使用它,动态地插入信息「可在这个阶段加载 <code>commitizen</code> 之类的辅助填写工具」</p></li><li><p><code>commit-msg</code> 钩子在即将提交前运行,勾子接收一个参数,即存有当前提交信息的临时文件的路径,可在这个阶段借助 <code>commitlint</code> 进行提交信息规范性检查;</p></li><li><p><code>post-commit</code> 钩子在整个提交过程完成后运行,它不接收任何参数,在这个阶段一般做一些通知操作。</p></li></ul><p>使用 Git 钩子最直观的方式是操作 .git/hooks 下的示例文件,将对应钩子文件的 .sample 后缀名移除即可启用。然而这种操作方式存在弊端:</p><ol><li>需要操作项目范围外的 .git 目录(有系统级别、全局级别的.git配置文件)</li><li>无法同步 .git/hooks 到远程仓库(.git是本地的git配置文件,不会被提交)</li></ol><p>可以将Git勾子的目录设置在项目的根目录下</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"># 指定 Git hooksPath 为根目录下的 .githooks 目录(原来是 .git/hooks 下的文件 )</span></span>
552<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">git</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> config</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> core.hooksPath</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> .githooks</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div><p>安装husky</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> husky</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>安装lint-staged</p><div class="language-shell vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">shell</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -d</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> lint-staged</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br></div></div><p>在package.json</p><div class="language-json vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">json</span>
552<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//在hooks中可以定有Git勾子</span></span>
553<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;husky&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
554<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;hooks&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
555<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">      &quot;pre-commit&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;lint-staged&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
556<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">      &quot;commit-msg&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;&quot;</span></span>
557<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    }</span></span>
558<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">},</span></span>
559<span class="line"></span>
560<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//针对暂存区进行操作</span></span>
561<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;lint-staged&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
562<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  	//指定 什么类型的文件:[&quot;执行命令1&quot;,&quot;执行的命令2&quot;]</span></span>
563<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  	//一般把命令放在script字段里,这里直接调用其中的命令</span></span>
564<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  	//最后以一个命令是git add ,将前面命令做的代码变更重新加到暂存区</span></span>
565<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;**/*.{js,vue}&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:[</span></span>
566<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &quot;npm run lint&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
567<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &quot;npm run prettier&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
568<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">      &quot;git add&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> </span></span>
569<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">    ]</span></span>
570<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">},</span></span>
571<span class="line"></span>
572<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">//</span></span>
573<span class="line"><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;scripts&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: {</span></span>
574<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;dev&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;xxxxx&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
575<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;build&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;xxxxx&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
576<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  	//eslint修复 --fix是自动修复</span></span>
577<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;lint-fix&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;eslint --fix --ext .js app/&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
578<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  	//eslint --ext指定文件类型和目录(支持glob方式)</span></span>
579<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;lint&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;eslint --ext .js app/&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
580<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  </span></span>
581<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  	//prettier</span></span>
582<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">  	&quot;prettier&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;prettier --write&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">,</span></span>
583<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">  </span></span>
584<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">  	//</span></span>
585<span class="line"><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">    &quot;changelog&quot;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">: </span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">&quot;conventional-changelog -p angular -i CHANGELOG.md -s&quot;</span></span>
586<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">},</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br></div></div><p>待补充</p><ul><li><p>commit message限制和change log限制<a href="https://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html" target="_blank" rel="noreferrer">Commit message 和 Change log 编写指南</a></p><div class="language-bash vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">bash</span>
586<pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> commitizen</span></span>
587<span class="line"><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">npm</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> install</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> -g</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> conventional-changelog</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br></div></div></li><li><p>commitLint</p></li><li><p>styleLint</p></li></ul><h2 id="其他配置文件" tabindex="-1">其他配置文件 <a class="header-anchor" href="#其他配置文件" aria-label="Permalink to &quot;其他配置文件&quot;">​</a></h2><h3 id="gitignore" tabindex="-1">.gitignore <a class="header-anchor" href="#gitignore" aria-label="Permalink to &quot;.gitignore&quot;">​</a></h3><div class="language-.gitignore vp-adaptive-theme line-numbers-mode"><button title="Copy Code" class="copy"></button><span class="lang">.gitignore</span><pre class="shiki shiki-themes github-light github-dark vp-code" tabindex="0"><code><span class="line"><span>#mac系统下,记录文件夹位置的文件</span></span>
588<span class="line"><span>.DS_Store</span></span>
589<span class="line"><span></span></span>
590<span class="line"><span>#依赖安装目录</span></span>
591<span class="line"><span>node_modules</span></span>
592<span class="line"><span></span></span>
593<span class="line"><span>#打包路径</span></span>
594<span class="line"><span>/dist</span></span>
595<span class="line"><span></span></span>
596<span class="line"><span># local env files</span></span>
597<span class="line"><span>.env.local</span></span>
598<span class="line"><span>.env.*.local</span></span>
599<span class="line"><span></span></span>
600<span class="line"><span># 日志文件</span></span>
601<span class="line"><span>npm-debug.log*</span></span>
602<span class="line"><span>yarn-debug.log*</span></span>
603<span class="line"><span>yarn-error.log*</span></span>
604<span class="line"><span>pnpm-debug.log*</span></span>
605<span class="line"><span></span></span>
606<span class="line"><span># 编辑器配置文件</span></span>
607<span class="line"><span>.idea</span></span>
608<span class="line"><span>.vscode</span></span>
609<span class="line"><span>*.suo</span></span>
610<span class="line"><span>*.ntvs*</span></span>
611<span class="line"><span>*.njsproj</span></span>
612<span class="line"><span>*.sln</span></span>
613<span class="line"><span>*.sw?</span></span></code></pre><div class="line-numbers-wrapper" aria-hidden="true"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br></div></div><h2 id="总结" tabindex="-1">总结 <a class="header-anchor" href="#总结" aria-label="Permalink to &quot;总结&quot;">​</a></h2><p>EditorConfig 作用于预览和输入阶段,Prettier 在保存和提交阶段重新组织代码,Prettier 会成为代码形态的最终决定者</p><h2 id="参考" tabindex="-1">参考 <a class="header-anchor" href="#参考" aria-label="Permalink to &quot;参考&quot;">​</a></h2><p><a href="https://zhuanlan.zhihu.com/p/75531199" target="_blank" rel="noreferrer">深入理解 ESLint</a></p><p><a href="https://juejin.cn/post/6859291468138774535" target="_blank" rel="noreferrer">Eslint中plugins和extends的区别</a></p><p><a href="https://eslint.bootcss.com/docs/user-guide/getting-started" target="_blank" rel="noreferrer">ESLint中文网</a></p><p><a href="https://zhuanlan.zhihu.com/p/366141969" target="_blank" rel="noreferrer">前端代码规范化:EditorConfig + Prettier + ESLint</a></p><p><a href="https://blog.csdn.net/xgangzai/article/details/107724367" target="_blank" rel="noreferrer">让你的 commit 更有价值(规范)</a></p><p><a href="http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html" target="_blank" rel="noreferrer">Commit message 和 Change log 编写指南——阮一峰</a></p>`,119)]))}const g=a(l,[["render",e]]);export{c as __pageData,g as default};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.