抛开脚手架,徒手搭建 react 项目(三)

308 阅读3分钟

[《抛开脚手架,徒手搭建 react 项目(一)》](juejin.cn/post/739816… ")我们用webpack搭建了一个react项目,引入了typescript,用Babel编译,还用webpack-merge拆分了我们的配置文件。

《抛开脚手架,徒手搭建 react 项目(二)》我们在项目里面引入了eslint,还介绍了打开服务的五种方法。尤其重要的是 nginx,要你在本地体验一把线上奔跑的感觉。

《抛开脚手架,徒手搭建 react 项目(三)》我们在项目里面引入了 stylelint、还有husky相关工具,轻松实现git commit的时候,对代码格式和提交信息做具体的检测。

《抛开脚手架,徒手搭建 react 项目,webpack打包优化篇(四)》亲手测试并整理了六点减少打包时间的手段。

抛开脚手架,徒手搭建 react 项目,webpack打包优化篇(五) 亲手测试并整理了六点能够缩减打包体积的手段

《webpack插件汇总地址》 帮我总结好了,各种各样的插件。

点赞 + 收藏 === 学会🤣🤣🤣

1.stylelint

Stylelint 本身不提供自动缩进功能,因为它主要是一个样式代码质量检查工具。

文档: webpack.docschina.org/plugins/sty…

npm install --save-dev stylelint stylelint-webpack-plugin stylelint-config-standard

设置配置文件.stylelintrc.js

module.exports = {
  // 从标准配置中继承规则
  extends: ['stylelint-config-standard'],

  // 规则配置
  rules: {
    // 禁用注释前的空行规则
    'comment-empty-line-before': null,
    // 禁用声明前的空行规则
    'declaration-empty-line-before': null,
    // 指定函数名的大小写为小写
    'function-name-case': 'lower',
    // 禁用选择器特异性递减规则
    'no-descending-specificity': null,
    // 禁用无效的双斜杠注释规则
    'no-invalid-double-slash-comments': null,
    // 指定规则前需要空行
    'rule-empty-line-before': 'always',
  },

  // 忽略检查的文件或文件夹
  ignoreFiles: ['node_modules/**/*', 'build/**/*'],
};

配置webpack.config.js,在webpack里面集成stylelint-webpack-plugin,其目的是打包的前想检测css代码。

const StylelintPlugin = require('stylelint-webpack-plugin');
 plugins: [
     .....
     new StylelintPlugin({
      files: ["src/**/*.{vue,scss,css,less}"], // 指定要检查的文件
      fix: false // 是否自动修复一些样式错误
    })
  ],

如果你想要在写代码的时候,样式自动格式化,就要安装vscodestyleLint插件

image.png

然后在vscode的设置文件setting里面配置一下

image.png

测试下看看

image.png

如果你想要你自己配置的eslint和styleLint变成项目共有的,就在项目的顶层创建.vscode\settings.json文件,然后它就会随项目被保存到github上去,这样所有人都可以有整个文件了。

image.png

2.postcss-loader

设置样式兼容性问题,利用 postcss

npm install --save-dev postcss-loader autoprefixer

配置webpack.config.js文件

module.exports = {
  // ...
  module: {
    rules: [
      // ...
      {
        test: /\.(scss|css)$/,
        use: [
          'style-loader',
          'css-loader',
          'postcss-loader', // 添加postcss-loader
          'sass-loader' // 如果是Sass/SCSS文件
        ]
      }
    ]
  }
  // ...
};

创建postcss.config.js文件

import autoprefixer from 'autoprefixer';

export default {
  plugins: [
    autoprefixer
  ]
}

package.json里面配置

  "browserslist": [
    "defaults",
    "not ie < 8",
    "last 2 versions",
    "> 1%",
    "iOS 7",
    "last 3 iOS versions"
  ],

image.png

测试,你可以写个样式,打包测试也可以写个node文件测试,比如

image.png 完整代码


import postcss from 'postcss';
import autoprefixer from 'autoprefixer';

const css = 'a { transition: color 1s; }';

postcss([autoprefixer])
  .process(css)
  .then(result => {
    console.log(222222222);
    console.log(result.css);
  });

3.husky

huskygitkooks 实现的工具,它允许开发者轻松地在各种Git事件触发时运行脚本。例如,在提交之前(pre-commit)、推送之前(pre-push)、或者在提交信息被写入后(commit-msg)等。

husky是个 git 梯子,lint-staged 是个集成器

注意事项:测试husky之前要确保你的项目已经被git托管了,如果没有,你执行git的命令就会报错

image.png

解决办法:`git init`

安装husky

npm install husky@9.1.1 -D

启用 Git 钩子,执行下面这个命令后,Husky 会自动设置 Git 钩子。很多博文说需要执行的命令是npx husky install或者npx husky add但是执行他们都会报命令已经被废弃,这个和版本有关系,所以husky@9.X使用npx husky install即可。

npx husky init

产生下图文件

image.png

测试husky

image.png

此时说明husky成功捕获commit钩子。

4.lint-staged

lint-staged 是一个在提交代码之前运行检测的工具。当开发执行git commit 时,lint-staged 会对暂存区的文件进行代码风格检查器(如ESLint、Prettier)、代码格式化工具或测试套件等。

安装 lint-staged

通常husky与lint-staged搭配使用,lint-staged用于让eslint仅对添加到了暂存区的文件校验,避免了不必要的每次提交时eslint全局校验。

 npm i lint-staged@15.2.2 -D

配置package.json,7有的博文说要加下面这个

  "husky": {
    "hooks": {
      "pre-commit": "lint-staged",
    }
  },

测试发现并不需要,直接加命令和配置即可

{
  ...省略
  "scripts": {
    "prepare": "husky",
    "lint:lint-staged": "lint-staged"
  },
  ....省略
  "lint-staged": {
    "src/**/*.{ts,tsx,js,jsx}": [
      "eslint --config .eslintrc.js"
    ],
    "src/**/*.{css,less,scss}": [
      "stylelint --config .stylelintrc.js"
    ]
    "*.{ts,tsx,js,json,html,yml,css,less,scss,md}": [//可选的
      "prettier --write"
    ]
  },
}

.husky/pre-commit配置npm run lint:lint-staged

image.png

测试lint-staged

lint——staged是对git add 缓存区里面的数据进行检测,如果缓存区没有数据,那么就会报错,

image.png

所以先执行git add . 再执行 npx lint-atsged

image.png

可以看到commit后实际执行了package.jsonscripts里的"lint:lint-staged"指令,该指令执行的就是package.json中lint-staged配置的内容

通过上面的步骤,就完成了lint-staged的配置,这个时候再进行 git 提交时,将只检查暂存区(staged)的文件,不会检查项目所有文件,加快了每次提交 lint 检查的速度,同时也不会被历史遗留问题影响。通过这样的约束让我们定义的规则规范大家都能去遵守,共同维护代码的质量。

5.commitlint

husky帮我们在提交的时候模拟git钩子,但如果要配置提交时候的message格式校验,则需要commitlint 的帮助。

commitlint 是:我们在执行 git commit 时时候,帮我们检查 message 是否符合规范。

现在我们基本都遵从的 Angular 的提交规范: 就是这个@commitlint/config-conventional

安装

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

创建配置文件:.commitlintrc.js

module.exports = {
  extends: ['@commitlint/config-conventional'],
  rules: {
    'type-enum': [
      2,
      'always',
      [
        'build',
        'ci',
        'chore',
        'docs',
        'feat',
        'fix',
        'perf',
        'refactor',
        'revert',
        'style',
        'test',
        'addLog',
      ],
    ],
  },
};

打开.husky\_\commit-msg 增加一个git钩子,意思就是在执行git的时候才去做这个事情

npx --no-install commitlint --edit "$1"

image.png

有得博文说要在package.json里面配置git钩子,其实不需要。我们就用不加的测试看看

 "commit-msg": "commitlint --config .commitlintrc.js -E HUSKY_GIT_PARAMS"

image.png

测试commitlint

image.png

commitlint的替换方案:

其实也不必需要commitlint,利用husky可以在commit的时候获取message,可直接使用正则表达式来校验message是否合格以此控制commit是否继续提交
先去掉以上关于commitlint的操作,回到最开始的时候。
仍然是 .husky,在-目录找到commit-msg文件,增加以下内容:


#!/usr/bin/env sh

# npx --no-install commitlint --edit "$1"

commit_msg=`cat $1`

msg_re="(^(feat|fix|docs|style|refactor|test|chore|revert)(([A-Z]+-[0-9]+)): .{1,100})|(^Merge .*branch [\s\S]*)|(^Revert [\s\S]*)"

if [[ ! $commit_msg =~ $msg_re ]]
then
    echo -e "Commit message does not follow the pattern: $msg_re , eg:\nfeat(CARCN-1479): add comments\nfix(CARCN-1478): handle events on blur (close #28)\n Please reference the git commit documentation : https://porschedigital.atlassian.net/wiki/spaces/TECHCN/pages/6496256003/Git+Commit+policy+including+Frontend+and+Backend"

    # 异常退出
    exit 1
fi

其中$1是打印出来是.git/COMMIT_EDITMSG,用cat $1执行后得到的就是commit时候输入的message内容。

测试

image.png

6.Commitizen

git提交的时候,好的文案可以帮我更快,更好的理解项目,找到队友每次提交都干了什么,如果需要回退,那就可以根据文案准确无误的找到分支。

Commitizen是一个基于命令行的交互式工具,它可以帮助开发者规范化提交Git提交信息,符合Angular Commit Message Conventions的规范,从而更好地管理代码变更历史。

Commitizen提供了一个友好的命令行交互界面,让开发者根据规范选择提交信息的类型、影响范围等内容,自动生成符合规范的Git提交信息。

Commitizen可以与Git结合使用,使得开发者可以使用commitizen命令代替git commit命令提交代码变更,并且生成的提交信息格式更加规范化和易于管理。

cz-conventional-changelog是一个规范库,就是你提交的时候,可以从这个库里面选择你要做的事情。

安装

npm install  commitizen  -D
npm install  cz-conventional-changelog -D

在pageage.json中增加更改commitizen的配置,并增加脚本

"config":{
    "commitizen":{
        "path":"node_modules/cz-conventional-changelog"
    }
}

"scripts":{
    commit:"git-cz"
}

测试

执行npm run commit

image.png

执行git commit -m "dddd"

image.png

我们发现git的时候居然没有调用Commitizen ,那是不是玩了个寂寞?而且它还是英文的,我就看的不爽咋办?搞个中文的呀!有不爽就要有反叛。

7.cz-customizable 优化Commitizen

cz-customizable 是 Commitizen的一个插件,可以帮助开发者自定义符合Angular Commit Message Conventions的提交信息格式和内容。

安装

npm install cz-customizable --save-dev

package.json 中,将原来commit配置,变更为自定义配置

"config": {
    "commitizen": {
    "path": "node_modules/cz-customizable"
    }
}

commitlint.config.js

module.exports = {
  extends: ['cz'],
  rules: {},
};

增加 .cz-config.js

'use strict';
module.exports = {
	types: [
		{value: 'feat', name: '✨新增:    新的内容'},
		{value: 'fix', name: '🐛修复:    修复一个Bug'},
		{value: 'docs', name: '📝文档:    变更的只有文档'},
		{value: 'style', name: '💄格式:    空格, 分号等格式修复'},
		{value: 'refactor', name: '️♻️重构:    代码重构,注意和特性、修复区分开'},
		{value: 'perf', name: '️️⚡️性能:    提升性能'},
		{value: 'test', name: '✅测试:    添加一个测试'},
		{value: 'build', name: '🔧工具:    开发工具变动(构建、脚手架工具等)'},
		{value: 'rollback', name: '⏪回滚:    代码回退'},
		{value: 'addLog', name: '👨🏻‍💻添加log:    代码回退'},
	],
	scopes: [
		{name: 'leetcode'},
		{name: 'javascript'},
		{name: 'typescript'},
		{name: 'Vue'},
		{name: 'node'},
	],
	// it needs to match the value for field type. Eg.: 'fix'
	/*  scopeOverrides: {
	fix: [
	  {name: 'merge'},
	  {name: 'style'},
	  {name: 'e2eTest'},
	  {name: 'unitTest'}
	]
  },  */
	// override the messages, defaults are as follows
	messages: {
		type: '选择一种你的提交类型:',
		scope: '选择一个scope (可选):',
		// used if allowCustomScopes is true
		customScope: 'Denote the SCOPE of this change:',
		subject: '短说明:\n',
		body: '长说明,使用"|"换行(可选):\n',
		breaking: '非兼容性说明 (可选):\n',
		footer: '关联关闭的issue,例如:#31, #34(可选):\n',
		confirmCommit: '确定提交说明?(yes/no)',
	},
	allowCustomScopes: true,
	allowBreakingChanges: ['特性', '修复'],
	// limit subject length
	subjectLimit: 100,
};

测试

image.png

配置使用git commit走自定义配置

更改husky/_/prepare-commit-msg钩子,如下:

#!/bin/bash
exec < /dev/tty && node_modules/.bin/cz --hook || true

测试

image.png

把之前commit-msg里面的代码干掉,要他用commitlint检测,在commit-msg里面加入下面的代码,注意的是#!/usr/bin/env sh不要删除,删除就找不到这个文件了。

#!/usr/bin/env sh
npx --no-install commitlint --edit "$1"

image.png

然后测试

image.png

你的提交文案最后变成了这个: fix(custom): ceshi

8.关于git检测最佳实现方案

关于git的最佳实现方案是:husky,lint-staged,commitizen, cz-customizable,commitlint。

husky是git的钩子,必须存在。

lint-staged 是把eslint,stylelint检测工具勾进来的工具,一旦代码格式出问题,它就会阻止commit。

commitizen 是自动化提供git commit 提交文案的工具

cz-customizable 是自定义提交文案的工具

commitlint是检测你提交文案是否正确的工具。

执行npm init @eslint/config@latest 等价于npm i eslint -D 和 npx eslint 

参考文件:

eslint.nodejs.cn/docs/latest…