create-react-app 英文 https://create-react-app.dev/
create-react-app 中文 https://www.html.cn/create-react-app/docs/production-build/
create-react-app 初始化
初始化 create-react-app,craco-antd配置
- yarn start 启动项目
- yarn build 构建项目
- yarn test 单元测试
- yarn eject 抛出 webpack配置 ```bash npx create-react-app my-app yarn create react-app my-app
npm init react-app my-app
更新 react-scripts
npm install react-scripts@latest
yarn start 看到这个界面,create-react-app就初始化成功了<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/112859/1629555481016-1fdb11bd-c342-4b80-97a6-40c6d6b38e6c.png#clientId=u108bd36d-ae90-4&from=paste&height=294&id=ue547ae70&originHeight=662&originWidth=1230&originalType=binary&ratio=1&rotation=0&showTitle=false&size=56454&status=done&style=none&taskId=u9db36bbd-2230-4af8-b82c-d861ef89165&title=&width=547)
<a name="jicG2"></a>
## 自定义脚手架
```bash
# 初始化 js项目
npx create-react-app [项目名] --template @eleven.fe/cra-template
npx create-react-app myapp --template @eleven.fe/cra-template
# 初始化 ts项目
npx create-react-app [项目名] --template @eleven.fe/cra-template-typescript
"husky": {
"hooks": {
"pre-add": "pretty-quick --staged",
"pre-commit": "pretty-quick --staged"
}
},
https://www.npmjs.com/package/@eleven.fe/cra-template
https://github.com/eleven-net-cn/create-react-app
importLoaders
用于配置「css-loader 作用于 @import 的资源之前」有多少个 loaderimportLoaders: 1
是在css-loader
之后指定1个数量的loader(即 postcss-loader)来处理import进来的资源
webpack文档 https://webpack.docschina.org/loaders/css-loader/#importloaders
0 => no loaders (default);
1 => postcss-loader;
2 => postcss-loader, sass-loader
这里的数量指的是当前loader之后loader的数量
- 等于1是说,当前loader之后的一个loader
- 如果是n就是n个loader
- 官网上说是importLoaders的数量默认是0,意思是一个加载器都不用
- 1的意思是用 postcss-loader加载器,
- 2的意思是用 postcss-loaders和sass-loader加载器
babelrc
create-react-app默认是不使用.babelrc的,使用的是package.json中的babel配置和内部配置
config/webpack.config.js文件,将babelrc:false改为true,意思是启用.babelrc的配置
- 同时将package.json中的babel下面的 “presets”: [ “react-app” ] 配置到.babelrc中
- 并将package.json中的babel删除掉
删除 package.json里面的 babel,移动到 .babelrc
"babel": {
"presets": [
"react-app"
]
}
在根目录新建 .babelrc,并添加
{
"presets": [
"react-app"
],
"plugins": [
[
"import",
{
"libraryName": "antd",
"libraryDirectory": "es",
"style": true
}
]
]
}
install babel-plugin-import
yarn add babel-plugin-import -D
修改 /config/webpack.config.js
- 单独根目录新建.babelrc会报错的,原因:如果是运行了eject ,webpack配置了babelrc: false
- 需要在webpack.config.js配置,在module模块,找到 loader: require.resolve(‘babel-loader’) 对象中的plugins数组中添加
- 411行 plugins:[],新增
// style: true 加载 less 文件
["import", {"libraryName": "antd", "libraryDirectory": "es", "style": true}],
看到默认的按钮,变色,就代表自定义主题配置成功了
cssModules
默认支持 *.module.css
import styles from './App.module.css';
scss配置
create-react-app支持 scss,直接安装 sass-loader就行
scss需要安装 sass-load & node-sass
yarn add sass-loader node-sass -D
使用 scss
import styles from './App.module.css';
less配置
less需要安装 less & less-loader
yarn add less less-loader -D
/config/webpack.config.js
- 65行新增 lessRegex
const lessRegex = /\.less$/;
const lessModuleRegex = /\.module\.less$/;
- 65行新增 lessRegex
542行新增代码如下,就是 把 sassRegex和 sassModuleRegex的配置复制下,然后修改为 less
{
test: lessRegex,
exclude: lessModuleRegex,
use: getStyleLoaders(
{
importLoaders: 2,
sourceMap: isEnvProduction && shouldUseSourceMap,
},
'less-loader'
),
sideEffects: true,
},
{
test: lessModuleRegex,
use: getStyleLoaders(
{
importLoaders: 2,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: {
getLocalIdent: getCSSModuleLocalIdent,
},
},
'less-loader'
),
},
结果如下:没有解析 less
- /static/media/App.module.0616ec45.less
重要的一步
- 在 node_modules目录下找到 getCSSModuleLocalIndent.js
- 21行新增 less
- less-loader模块之后报错,如下
- TypeError: this.getOptions is not a function
- 原因: less-loader安装的版本过高
- 是
less-loader
的版本过高,不兼容getOptions
函数方法,需要对less-loader
进行降级处理yarn add less-loader@5.0.0 -D
import styles from './App.module.less';
重要说明:less
配置规则放在 sass
的解析规则下面即可,如果放在了 file-loader
的解析规则下面,less
文件解析不会生效
alias别名配置
webpack.config.js的resolve中配置alias别名
paths.appSrc,来源于 paths.js,
设置一个 @代表src目录即可
jsconfig.json
录中存在jsconfig.json文件表示该目录是JavaScript项目的根目录
jsconfig.json文件指定根文件和JavaScript语言服务提供的功能选项
jsconfig.json源于tsconfig.json,是TypeScript的配置文件
jsconfig.json相当于tsconfig.json的“allowJs”属性设置为true
在根路径下新建 jsconfig.json 可以让 IDEA识别项目的别名(如:@
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@/*": ["src/*"],
"@assets/*": ["src/assets/*"],
"@components/*": ["src/components/*"]
}
},
"exclude": ["node_modules", "dist", "build"]
}
提示:您将要排除由构建过程生成的文件(例如,dist目录
这些文件会导致建议显示两次,并会降低IntelliSense的速度
webstorem不识别 @别名
~ 波浪线是相对于其他路径(文件)的,类似于相对路径
去掉波浪线会报错
~@/assets/scss/_variables.scss 表示相对于@(别名,一般是src目录)下的
@import '~@/assets/less/variable.less';
.header {
color: @primary-color;
}
项目根目录新建 aliasPath.js
const path = require('path')
module.exports = {
context: path.resolve(__dirname, './'),
resolve: {
extensions: ['.js', '.json'],
alias: {
'@': path.resolve('src'),
}
}
}
webstorm设置 webpack 路径
components设计
src/components/ 设计成一个整体
/components
/index.ts
/Header
/index.tsx
/Header.tsx
/index.module.css
/Footer
/index.tsx
/index.module.css
components/Header/index.tsx
export * from './Header'
components/Footer/index.tsx
export * from './Footer'
components/index.ts
- 导出components下的所有文件夹
export * from './Header'
export * from './Footer'
组件使用 components下的组件,以 App.tsx为例
import React from 'react'
import {Header, Footer} from '../components'
import styled from './app.module.less'
function App() {
return (
<div className={styled.app}>
<Header />
<Footer />
</div>
)
}
export default App
eslint配置
a标签href属性警告解决方法
The href attribute is required for an anchor to be keyboard accessible.
Provide a valid, navigable address as the href value.
If you cannot provide an href, but still need the element to resemble a link, use a button and change it with appropriate styles.
Learn more: https://github.com/evcohen/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md jsx-a11y/anchor-is-valid
去除,a href属性警告,在package.json文件中添加如下代码
a标签警告参考 https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/master/docs/rules/anchor-is-valid.md
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
],
"rules":{
"jsx-a11y/anchor-is-valid":"off"
}
},
有效的 href
<a href="https://github.com" />
<a href="#section" />
<a href="foo" />
<a href="/foo/bar" />
<a href={someValidPath} />
<a href="https://github.com" onClick={foo} />
<a href="#section" onClick={foo} />
<a href="foo" onClick={foo} />
<a href="/foo/bar" onClick={foo} />
<a href={someValidPath} onClick={foo} />
错误的用法
<a onClick={foo} />
<a href="#" onClick={foo} />
<a href={"#"} onClick={foo} />
<a href={`#`} onClick={foo} />
<a href="javascript:void(0)" onClick={foo} />
<a href={"javascript:void(0)"} onClick={foo} />
<a href={`javascript:void(0)`} onClick={foo} />
// 缺少 href属性
<a />
<a href={undefined} />
<a href={null} />
// 无效的 href属性,错误的用法
<a href="#" />
<a href={"#"} />
<a href={`#`} />
<a href="javascript:void(0)" />
<a href={"javascript:void(0)"} />
<a href={`javascript:void(0)`} />
Guppy可视化
create-react-app 可视化管理工具
react 应用程序管理器和任务运行器
https://github.com/chinanf-boy/guppy-docs-zh
- create-react-app 可视化创建新项目
- 运行开发服务器
- 执行任务 (构建生产,运行测试)
- 管理依赖项 (添加,更新,搜索)