react工程化配置

道阻且长,行而不辍,未来可期

1.安装react

yarn create react-app demo --template typescript
cd demo
yarn start

2.配置蓝图模版

2.1安装blueprint插件
请添加图片描述

https://github.com/shredor/blueprint-templates-cli#readme
yarn add blueprint-templates-cli

2.2创建一个blueprint-templates文件夹
请添加图片描述
创建文件的时候会出现New File from Template的选项
请添加图片描述
输入文件的名字,便会根据模版动态的创建文件

注意⚠️:在vscode中需要直接打开项目,而不能打开项目的父文件
error如下图所示
请添加图片描述
项目的名字叫template,父文件叫“未命名文件夹7”
vs打开的是父文件,然后创建文件夹的时候如果选New File from Template就会报错
错误如下。
错误:No templates found. Please see https://github.com/reesemclean/blueprint for information on setting up Blueprint in your project.
可以去仓库中查看我的蓝图模版:https://github.com/1linan/template

创建模版后:

找不到模块“react”或其相应的类型声明。

请添加图片描述
安装react的类型

yarn add @types/react --dev

3.配置less + less module

在react项目中如果我们想修改默认的webpack配置,我们可以通过eject导出默认配置文件进行修改
但是这样的操作是不可逆的。更推荐使用craco或者react-app-rewired这样的工具来达到修改webpack的目的。

我选择的是craco工具
3.1在工程中引入craco 和 craco-less

yarn add @craco/craco  
yarn add craco-less

3.2修改package.json
打开package.json文件,修改 package.json 里的 scripts 属性。

/* package.json */
"scripts": {
-   "start": "react-scripts start",
-   "build": "react-scripts build",
-   "test": "react-scripts test",
+   "start": "craco start",
+   "build": "craco build",
+   "test": "craco test",
}

3.3在项目根目录创建一个 craco.config.js 用于修改默认配置。

const CracoLessPlugin = require("craco-less");
const { loaderByName } = require("@craco/craco");module.exports = {plugins: [{plugin: CracoLessPlugin,options: {modifyLessModuleRule(lessModuleRule, context) {// Configure the file suffixlessModuleRule.test = /.module.less$/;// Configure the generated local ident name.console.log(lessModuleRule)const cssLoader = lessModuleRule.use.find(loaderByName("css-loader"));cssLoader.options.modules = {localIdentName: "[local]_[hash:base64:5]",};return lessModuleRule;},},},],
};

如果使用的是TypeScript编程,则在react-app-env.d.ts.文件中添加以下内容,解决模块问题

declare module '*.module.less' {const classes: {readonly [key: string]: string}export default classesdeclare module '*.less'
}

4.配置别名路径

4.1在craco.config.js 文件中添加如下配置

const path = require('path')
module.exports = {// webpack 配置webpack: {// 配置别名alias: {// 约定:使用 @ 表示 src 文件所在路径'@': path.resolve(__dirname, 'src'),// 约定:使用 @scss 表示全局 SASS 样式所在路径// 在 SASS 中使用'@scss': path.resolve(__dirname, 'src/assets/styles')}}
}

4.2在tsconfig.json中添加如下配置

{"compilerOptions": {"baseUrl": "./","paths": {"@/*": ["src/*"],"@scss/*": ["src/assets/styles/*"]}}
}

4.3 在./tsconfig.json中新增一条配置, “extends”: “./path.tsconfig.json”

{"extends": "./path.tsconfig.json","compilerOptions": {"target": "es5","lib": ["dom","dom.iterable","esnext"],...
}

5.ESLint+Prettier

5.1 添加ESlint的配置

ESLint的主要功能包含代码格式和代码质量的校验。
Prettier 是一款代码格式化工具,用于检测代码中的格式问题,比如单行代码长度、tab长度、空格、逗号表达式等。更偏向于统一项目的编码风格。

yarn eslint --dev
yarn add eslint-config-prettier eslint-plugin-prettier prettier --dev
yarn add @typescript-eslint eslint-plugin-react --dev

prettier 需要用prettier对代码的格式进行检查和修正,下载prettier包
eslint-config-prettier:关闭不必要的或者可能和Prettier冲突的规则

eslint-plugin-react:插件–React 代码规范的校验规则

  • react/jsx-key:用来检查是否声明了 key 属性
  • no-array-index-key:用来检查是否使用了数组索引声明 key 属性

react-hooks:React hooks 代码规范的校验规则

  • rules-of-hooks: 用来检查 Hook 的规则(不能 if/循环中使用 Hooks)
  • exhaustive-deps 规则,此规则会在useEffct添加错误依赖时发出警告并给出修复建议

创建.eslintrc.cjs

module.exports = {env: {browser: true,es2021: true,node: true},extends: ["eslint:recommended", //作为基本规则集,继承eslint官方推荐的一些配置"plugin:react/recommended", //作为基本规则集"plugin:@typescript-eslint/recommended", //作为基本规则集,继承了一个由typesript官方提供的适合于ts代码检查的配置"prettier", //由于eslint和prettier都具备代码格式化的功能,并且可能出现冲突,所以继承eslint-config-prettier"plugin:prettier/recommended"],parser: "@typescript-eslint/parser", //作为ESlint的解析器,将Ts代码纳入ESLint校验范围,因为eslint默认的parser智能解析js,所以配置了parserparserOptions: {//对parser进行配置ecmaFeatures: {jsx: true},ecmaVersion: "latest",sourceType: "module"},plugins: ["react","@typescript-eslint","prettier", //注册eslint-plugin-prettier插件"import","eslint-plugin-react", //注册插件,React 代码规范的校验规则//react/jsx-key:用来检查是否声明了 key 属性//no-array-index-key:用来检查是否使用了数组索引声明 key 属性"react-hooks" //React hooks 代码规范的校验规则//rules-of-hooks: 用来检查 Hook 的规则(不能 if/循环中使用 Hooks)//exhaustive-deps 规则,此规则会在useEffct添加错误依赖时发出警告并给出修复建议],rules: {//开启eslint-plugin-prettier中的prettier规则//开启这条规则后,会将prettier的校验规则传递给eslint,这样eslint就可以按照prettier的方式来进行代码格式的校验"prettier/prettier": "error", //表示被prettier标记的地方抛出错误信息。quotes: ["error"], // // 字符串必须使用双引号,否则报错"react/jsx-boolean-value": 1,"react-hooks/rules-of-hooks": "error","react-hooks/exhaustive-deps": "warn","react/prop-types": "off",//Typescript 中,必须明确指定函数的返回值类型。并且函数中的return后的类型必须与指定的类型一致 参考文档/*下面是一个 "explicit-module-boundary-types" 规则的栗子// 会出现 explicit-module-boundary-types警告export default function () {return 1;}// 下面的函数不会出现警告export var fn = function (): number {return 1;};*/"@typescript-eslint/explicit-module-boundary-types": "off",//关闭explicit-module-boundary-types,TS 中可以通过类型推断判断出函数的返回值类型,因此可以关闭此 Lintsemi: ["error", "always"],"react/react-in-jsx-scope": "off","import/order": ["error",{alphabetize: {order: "asc"}}]}
};

添加 NPM 脚本

{"script": {"lint-staged:js": "eslint --ext .js,.jsx,.ts,.tsx ","lint:js": "eslint --cache --ext .js,.jsx,.ts,.tsx ./src","lint:fix": "eslint --fix --cache --ext .js,.jsx,.ts,.tsx"}
}

lint-staged:js: 只校验后缀名为".js,.jsx,.ts,.tsx"的文件
lint:js: 只校验src目录下,后缀名为".js,.jsx,.ts,.tsx"的文件中,被修改过的文件。这会生成一个.eslintcache文件用来缓存已校验过的文件
lint:fix: 根据 .eslintcache文件,校验被修改过的文件。并且自动修复

创建.eslintignore
如果需要屏蔽不需要检测的文件或目录,可以在项目根目录添加 .eslintignore

build
output
node_modules
src/idl
lib
.temp/
mock.js
.eslintrc.js
idl/

5.2添加 Prettier 代码自动格式化工具

yarn add prettier  --dev

在项目根目录新建.prettierrc 并加入以下内容

module.exports = {printWidth: 100, //一行的字符数,如果超过会进行换行,默认为80tabWidth: 2, //一个tab代表几个空格数,默认为2useTabs: false, //是否使用tab进行缩进,默认为false,表示用空格进行缩减singleQuote: false, //字符串是否使用单引号,默认为false,使用双引号semi: true, //如果 semi 设置为 true,将在语句末尾加上; trailingComma: "none", //是否使用尾逗号,有三个可选值"<none|es5|all>"bracketSpacing: true, //对象大括号直接是否有空格,默认为true,效果:{ foo: bar }endOfLine: "auto",//换行符使用lfproseWrap: "preserve",//使用默认的折行标准htmlWhitespaceSensitivity: "ignore",sxBracketSameLine: false, tsxBracketSameLine: false,jsxBracketSameLine: false,/**// true example<buttonclassName="prettier-class"id="prettier-id"onClick={this.handleClick}>Click Here</button>// false example<buttonclassName="prettier-class"id="prettier-id"onClick={this.handleClick}>Click Here</button>*/
};

为VSCode 安装 Prettier 插件
请添加图片描述
通过在“设置”中勾选“保存时进行格式化”选项, 就可以在文件保存时使用 Prettier 进行自动格式化

如果需要屏蔽不必要的文件,可以在项目根目录添加 .prettierignore并加入以下内容

*.svg
package.json
.DS_Store
.eslintignore
*.png
*.toml
.editorconfig
.gitignore
.prettierignore
LICENSE
.eslintcache
*.lock
yarn-error.log
/build
/public

添加 npm 脚本

"script":{"lint:prettier": "prettier --check \"src/**/*\" --end-of-line auto","prettier": "prettier -c --write \"src/**/*\""
}

lint:prettier:当想要检查文件是否已被格式化时,则可以使用–check标志(或-c)运行 Prettier。这将输出一条语义化的消息和未格式化文件的列表。上面脚本的意思是格式化src目录下的所有文件
prettier:重新格式化所有已被处理过的文件。类似于eslint --fix的工作。上面脚本的意思是重新格式化src目录下的所有文件

6.添加 stylelint

 "stylelint-config-prettier": "^9.0.5","stylelint-config-recess-order": "^4.0.0","stylelint-config-standard": "^30.0.1","stylelint-prettier": "^3.0.0",

新建 .stylelintrc.js并加入以下内容

module.exports = {// 继承一系列规则集合extends: ['stylelint-config-standard',],rules: {"indentation": 4,//# 缩进 4 个空格"string-quotes": "double",//使用双引号"declaration-block-trailing-semicolon": "always",//每个属性声明末尾都要加分号"declaration-empty-line-before": [//第一条属性声明前不允许有空行"never",{ ignore: [ "after-declaration" ] }],"rule-empty-line-before": [//每个样式规则前后都有空行,除了第一条规则与规则前有注释"always",{ except: [ "after-single-line-comment", "first-nested" ] }],"max-empty-lines": 1,//不允许超过一行的空行"no-eol-whitespace": true,//每行句末不允许有多余空格"no-missing-end-of-source-newline": true,//文件末尾需要有一个空行//大小写处理"unit-case": "lower","color-hex-case": "upper","value-keyword-case": "lower","function-name-case": "lower","property-case": "lower","at-rule-name-case": "lower","selector-pseudo-class-case": "lower","selector-pseudo-element-case": "lower","selector-type-case": "lower","media-feature-name-case": "lower",/****** */"block-opening-brace-newline-after": ["always"],"block-closing-brace-newline-before": ["always"],/*** demo * 正确* a{* color:red* }* * 错误* a{color:red}* a{color:red* }* a{* color:red}*//****** */// "selector-class-pattern":"^[a-z][a-zA-Z0-9]+$",//className命名为小驼峰},// 忽略其他文件,只校验样式相关的文件ignoreFiles: ["node_modules/**/*","public/**/*","build/**/*","**/*.js","**/*.jsx","**/*.tsx","**/*.ts",],
};

配置stylelint时常见问题
请添加图片描述
stylelint中className的命名
请添加图片描述
如果需要屏蔽不必要的文件,可以在项目根目录添加 .stylelintignore,并添加一下内容

node_modulesdist
public
docs
bin.husky
.local
.vscode
.idea
.cache*.md
*.woff
*.ttf

7.配置Git Hook
husky是一个gitHook工具,可以配置 git 的一些钩子,这里配置一个commit钩子。
在 git commit 命令运行时先校验 lint(eslint, stylelint 等)是否通过,未通过则不予提交。

lint-staged 是一个在 git 暂存文件上运行 lint 校验的工具,配合 husky 配置 commit 钩子,用于 git commit 前的强制校验

yarn add husky lint-staged --dev
{"scripts": {"precommit": "lint-staged","lint-staged:js": "eslint --ext .js,.jsx,.ts,.tsx"},"husky": {"hooks": {"pre-commit": "lint-staged"}},"lint-staged": {"**/*.less": "stylelint --syntax less","**/*.{js,jsx,ts,tsx}": "npm run lint-staged:js","**/*.{js,jsx,tsx,ts,less,md,json}": ["prettier --write"]}
}

在每次 git commit 之前会进入工作区文件扫描,自动修复 eslint/stylelint 问题再使用 prettier 自动格式化,最后再提交到工作区。

注意⚠️:必选先使用git init 初始化 git 仓库,之后使用 husky 才能生效

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/23792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WAF绕过-漏洞利用篇-sql注入+文件上传-过狗

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…

webpack基础知识六:说说webpack的热更新是如何做到的?原理是什么?

一、是什么 HMR全称 Hot Module Replacement&#xff0c;可以理解为模块热替换&#xff0c;指在应用程序运行过程中&#xff0c;替换、添加、删除模块&#xff0c;而无需重新刷新整个应用 例如&#xff0c;我们在应用运行过程中修改了某个模块&#xff0c;通过自动刷新会导致…

【C#学习笔记】装箱和拆箱

文章目录 装箱和拆箱性能消耗装箱拆箱 比较var&#xff0c;object&#xff0c;dynamic&#xff0c;\<T\>varobject\<T\> 泛型dynamic 装箱和拆箱 在讲引用类型object的时候&#xff0c;我们说它是万能的&#xff0c;却没说它万能在哪里。 除了object为每一种变量…

Grafana集成prometheus(4.Grafana添加预警)

上文已经完成了grafana对prometheus的集成及数据导入&#xff0c;本文主要记录grafana的预警功能&#xff08;以内存为例&#xff09; 添加预警 添加入口&#xff08;2个&#xff09; databorard面板点击edit&#xff0c;下方有个Alert的tab&#xff0c;创建Alert rules依赖…

ffmpeg + nginx 实现rtsp视频流转m3u8视频流,转码推流(linux)

FFmpeg即是一款音视频编解码工具&#xff0c;同时也是一组音视频编码开发套件&#xff0c;作为编码开发套件&#xff0c;它为开发者提供了丰富的音视频处理的调用接口。 FFmpeg提供了多种媒体格式的封装和解封装&#xff0c;包括多种音视频编码、多种协议的流媒体、多种多彩格式…

苹果电脑第三方应用程序卸载工具CleanMyMacX4.14

CleanMyMacX&#xff0c;这是一款可以帮助你快速识别并卸载电脑上的多个应用程序的第三方工具&#xff0c;省去了逐个卸载的繁琐步骤。 我们首先要到下载CleanMyMacX&#xff0c; CleanMyMac X全新版下载如下: https://wm.makeding.com/iclk/?zoneid49983 然后&#xff0c…

【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程

文章目录 4.4网络模型OSI七层参考模型TCP/IP四层模型&#xff08;常用&#xff09;简介四层介绍 4.5协议简介常见协议UDP协议TCP协议IP协议以太网帧协议&#xff08;MAC地址封装&#xff09;ARP协议&#xff08;IP->MAC&#xff09; 4.6网络通信的过程封装分用 4.4网络模型 …

Stable Diffusion 硬核生存指南:WebUI 中的 GFPGAN

本篇文章聊聊 Stable Diffusion WebUI 中的核心组件&#xff0c;强壮的人脸图像面部画面修复模型 GFPGAN 相关的事情。 写在前面 本篇文章的主角是开源项目 TencentARC/GFPGAN&#xff0c;和上一篇文章《Stable Diffusion 硬核生存指南&#xff1a;WebUI 中的 CodeFormer》提…

k8s存储卷

目录 一、为什么要存储卷&#xff1f;二、emptyDir存储卷三、hostPath存储卷四、 nfs共享存储卷五、PVC 和 PV5.1 PV和PVC之间的相互作用遵循的生命周期5.2 PV 的状态5.3 一个PV从创建到销毁的具体流程 六、静态创建pv和pvc资源由pod运用过程6.1 在NFS主机上创建共享目录&#…

03 制作Ubuntu启动盘

1 软碟通 我是用软碟通制作启动盘。安装软碟通时一定要把虚拟光驱给勾选上&#xff0c;其余两个可以看你心情。 2 镜像文件 我使用清华镜像网站找到的Ubuntu镜像文件。 Index of /ubuntu-releases/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 请自己选择镜像…

K8S系列文章之 使用Kind部署K8S 并发布服务

简单介绍 kind 即 Kubernetes In Docker&#xff0c;顾名思义&#xff0c;就是将 k8s 所需要的所有组件&#xff0c;全部部署在一个docker容器中&#xff0c;是一套开箱即用的 k8s 环境搭建方案。使用 kind 搭建的集群无法在生产中使用&#xff0c;但是如果你只是想在本地简单…

队列中offer,add;poll,remove;peek,element之间的区别

offer和add的区别 offer() 和 add() 都是向队列中加入新项。 一些队列有大小限制&#xff0c;因此如果想在一个满的队列中加入一个新项&#xff0c;多出的项就会被拒绝。 这时新的offer方法就可以起作用了。它不是对调用add()方法抛出一个unchecked异常&#xff0c;而只是得…

初阶C语言——特别详细地介绍函数

系列文章目录 第一章 “C“浒传——初识C语言&#xff08;更适合初学者体质哦&#xff01;&#xff09; 第二章 详细认识分支语句和循环语句以及他们的易错点 第三章 初阶C语言——特别详细地介绍函数 目录 系列文章目录 前言 一、函数是个什么鬼东西&#xff1f; 二、C语…

css中的bfc是什么?

什么bfc&#xff1f; BFC&#xff08;Block Formatting Context&#xff09;块级 格式化 上下文。 BFC就是页面上的一个隔离的独立盒子&#xff0c;容器里面的子元素和外面的元素不会相互影响。 为什么要bfc? bfc是我们去主动触发的,并不是自动就存在的,它是帮助我们解决cs…

【雕爷学编程】MicroPython动手做(28)——物联网之Yeelight 2

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

数据库与数据仓库的区别及关系

数据库与数据仓库的区别及关系 数据库数据仓库异同差异联系例子 数据库 数据库是结构化信息或数据的有序集合&#xff0c;一般以电子形式存储在计算机系统中。通常由数据库管理系统 (DBMS) 来控制。它是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集…

任务 13、MidJourney种子激发极致创作,绘制震撼连贯画作

13.1 任务概述 通过本次实验任务&#xff0c;学员将深入了解Midjourney种子的概念和重要性&#xff0c;以及种子对生成图像的影响。他们将学会在Midjourney平台中设置种子值并调整其参数&#xff0c;以达到所需的效果。此外&#xff0c;任务还详细介绍了Midjourney V4.0版本中…

openSUSE安装虚拟化 qemu kvm

1) 第一种&#xff1a;图形界面yast安装虚拟化 左下角开始菜单搜索yast 点一下就能安装&#xff0c;是不是很简单呢 2&#xff09;第二种&#xff1a; 命令行安装 网上关于openSUSE安装qemu kvm的教程比较少&#xff0c;可以搜索centos7 安装qemu kvm的教程&#xff0c;然后…

ZAFUACM - 23.8.5个人赛补题

文章目录 A - Lucky Conversion题意思路代码 B - Constanzes Machine题意思路代码 C - Maximum Median题意思路代码 D - Remove Extra One题意思路代码 E - A Determined Cleanup题意思路代码 F - Minimal k-covering A - Lucky Conversion 原题链接 题意 给出两个只包含“4…

vue-baidu-map-3x 使用记录

在 Vue3 TypeScript 项目中&#xff0c;为了采用 标签组件 的方式&#xff0c;使用百度地图组件&#xff0c;冲浪发现了一个开源库 ovo&#xff0c;很方便&#xff01;喜欢的朋友记得帮 原作者 点下 star ~ vue-baidu-map-3xbaidu-map的vue3/vue2版本&#xff08;支持v2.0、v…