基于脚手架创建项目「项目名称需要符合npm包规范」
$ npx create-next-app@latest
|- node_modules 包含安装的模块
|- public 页面模板和IconLogo
|- favicon.ico
|- index.html
|- src 我们编写的程序
|- index.jsx 程序入口「jsx后缀名可以让文件支持jsx语法」
|- package.json
|- ...
package.json说明
{
"name": "react-zf",
"version": "0.1.0",
"private": true,
"dependencies": {
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-scripts": "5.0.1",
"web-vitals": "^2.1.4" //性能检测工具
},
// 打包命令是基于react-scripts处理
"scripts": {
"start": "react-scripts start", // 开发环境:本地启动 web 服务器,预览打包内容
"build": "react-scripts build", // 生产环境:打包部署,打包的内容输出到 build 目录中
"test": "react-scripts test", // 单元测试
"eject": "react-scripts eject" // 暴露 webpack 配置规则,因为我想修改默认的打包规则
},
// 对 webpack 中 ESLint 词法检测的相关配置:
// + 词法错误 不符合标准规范
// + 符合标准 代码本身不会报错,但是不符合 ESLint 的检测规范
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
// 基于browserslist规范,设置浏览器的兼容情况
// @1. postcss-loader + autoprefixer会给 CSS3 设置相关的前缀
// @2. babel-loader 会把 ES6 编译为 ES5
"browserslist": {
"production": [
">0.2%", // 使用率超过 0.2%的浏览器
"not dead", // 不考虑 IE
"not op_mini all" // 不考虑欧朋浏览器
],
"development": [ // 都是用浏览器最后一个 版本
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}
# 暴露 webpack 配置规则
默认情况下,会把webpack配置项隐藏到node_modules
中,如果想修改,则需要暴露配置项:
$ yarn eject
多出的文件
暴露 webpack 配置规则之后,会多出两个文件夹,一个是 config(paths.js:打包中需要的一些路径管理。webpack.config.js:脚手架默认的 webpack 打包规则的配置。webpackDevServer.config.js:webpack-dev-server的配置),一个是 script(入 口文件)
{
"name": "react-zf",
"version": "0.1.0",
"private": true,
// 把webpack打包所需要的所有模块,都重新安装一遍,放在了依赖项中
"dependencies": {
"@babel/core": "^7.16.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.3",
"@svgr/webpack": "^5.5.0",
"@testing-library/jest-dom": "^5.17.0",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"babel-jest": "^27.4.2",
"babel-loader": "^8.2.3",
"babel-plugin-named-asset-import": "^0.3.8",
// babel-pleset-react-app 是对 @babel/preset-env 语法包的重写 [目的:把ES6转为ES5]重写的目的: 让语法包可以识别React的语法,实现代码转换
"babel-preset-react-app": "^10.0.1",
"bfj": "^7.0.2",
"browserslist": "^4.18.1",
"camelcase": "^6.2.1",
"case-sensitive-paths-webpack-plugin": "^2.4.0",
"css-loader": "^6.5.1",
"css-minimizer-webpack-plugin": "^3.2.0",
"dotenv": "^10.0.0",
"dotenv-expand": "^5.1.0",
"eslint": "^8.3.0",
"eslint-config-react-app": "^7.0.1",
"eslint-webpack-plugin": "^3.1.1",
"file-loader": "^6.2.0",
"fs-extra": "^10.0.0",
"html-webpack-plugin": "^5.5.0",
"identity-obj-proxy": "^3.0.0",
"jest": "^27.4.3",
"jest-resolve": "^27.4.2",
"jest-watch-typeahead": "^1.0.0",
"mini-css-extract-plugin": "^2.4.5",
"postcss": "^8.4.4",
"postcss-flexbugs-fixes": "^5.0.2",
"postcss-loader": "^6.2.1",
"postcss-normalize": "^10.0.1",
"postcss-preset-env": "^7.0.1",
"prompts": "^2.4.2",
"react": "^18.2.0",
"react-app-polyfill": "^3.0.0",
"react-dev-utils": "^12.0.1",
"react-dom": "^18.2.0",
"react-refresh": "^0.11.0",
"resolve": "^1.20.0",
"resolve-url-loader": "^4.0.0",
"sass-loader": "^12.3.0",
"semver": "^7.3.5",
"source-map-loader": "^3.0.0",
"style-loader": "^3.3.1",
"tailwindcss": "^3.0.2",
"terser-webpack-plugin": "^5.2.5",
"web-vitals": "^2.1.4",
"webpack": "^5.64.4",
"webpack-dev-server": "^4.6.0",
"webpack-manifest-plugin": "^4.0.2",
"workbox-webpack-plugin": "^6.4.1"
},
"scripts": {
"start": "node scripts/start.js",
"build": "node scripts/build.js",
"test": "node scripts/test.js"
},
"eslintConfig": {
"extends": [
"react-app",
"react-app/jest"
]
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
},
"jest": {
"roots": [
"<rootDir>/src"
],
"collectCoverageFrom": [
"src/**/*.{js,jsx,ts,tsx}",
"!src/**/*.d.ts"
],
"setupFiles": [
"react-app-polyfill/jsdom"
],
"setupFilesAfterEnv": [
"<rootDir>/src/setupTests.js"
],
"testMatch": [
"<rootDir>/src/**/__tests__/**/*.{js,jsx,ts,tsx}",
"<rootDir>/src/**/*.{spec,test}.{js,jsx,ts,tsx}"
],
"testEnvironment": "jsdom",
"transform": {
"^.+\\.(js|jsx|mjs|cjs|ts|tsx)": "<rootDir>/config/jest/babelTransform.js",
"^.+\\.css": "<rootDir>/config/jest/cssTransform.js",
"^(?!.*\\.(js|jsx|mjs|cjs|ts|tsx|css|json))": "<rootDir>/config/jest/fileTransform.js"
},
"transformIgnorePatterns": [
"[/\\\\]node_modules[/\\\\].+\\.(js|jsx|mjs|cjs|ts|tsx)",
"^.+\\.module\\.(css|sass|scss)"
],
"modulePaths": [],
"moduleNameMapper": {
"^react-native": "react-native-web",
"^.+\\.module\\.(css|sass|scss)$": "identity-obj-proxy"
},
"moduleFileExtensions": [
"web.js",
"js",
"web.ts",
"ts",
"web.tsx",
"tsx",
"json",
"web.jsx",
"jsx",
"node"
],
"watchPlugins": [
"jest-watch-typeahead/filename",
"jest-watch-typeahead/testname"
],
"resetMocks": true
},
"babel": {
"presets": [
"react-app"
]
}
}
script文件的说明
babel配置的说明
配置less
/*
默认安装和配置的是sass,如果需要使用less,则需要:
1. 安装
yarn add less less-loader@8 yarn remove sass-loader
2. 修改webpack.config.js
*/
// 72~73
const lessRegex = /\.less/;
const lessModuleRegex = /\.module\.less/;
//507~545
{
test: lessRegex,
exclude: lessModuleRegex,
use: getStyleLoaders(
...
'less-loader'
)
},
{
test: lessModuleRegex,
use: getStyleLoaders(
...
'less-loader'
),
}
配置别名
//313
resolve: {
...
alias: {
'@': path.appSrc,
...
}
}
配置预览域名
// scripts/start.js
// 48
const HOST = process.env.HOST || '127.0.0.1';
// 也可以基于 cross-env 设置环境变量
改变端口号
yarn add cross-env
// package.json
"scripts": {
"start": "cross-env PORT=1314 node scripts/start.js",
"build": "node scripts/build.js",
"test": "node scripts/test.js"
}
修改浏览器兼容
//package.json
//https://github.com/browserslist/browserslist
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
/* 对ES6内置API做兼容处理 */
// 框架中用react-app-polyfill对(@babel/polyfill)
import 'react-app-polyfill/ie9' // ie9
import 'react-app-polyfill/ie11'
import 'react-app-polyfill/stable'
处理跨域
1.在src
下新建setupProxy.js
文件
2.yarn add http-proxy-middleware
http-proxy-middleware: 实现跨域代理的模块 [webpack-dev-server的跨域代理原理,也是基于它完成的]
3.setupProxy.js
const { createProxyMiddleware } = require("http-proxy-middleware");
module.exports = function (app) {
// 代理多个就写多个app.use()
app.use(
createProxyMiddleware("/jian", {
target: "https://www.jianshu.com/",
changeOrigin: true,
ws: true,
pathRewrite: { "^/jian": "" },
})
);
// app.use(
// createPorxyMiddleware("/zhi", {
// target: "http://www.zhihu.com",
// changeOrigin: true,
// ws: true,
// pathRewrite: { "^/zhi": "" },
// })
// );
};
//测试地址:
//https://www.jianshu.com/asimov/subscriptions/recommended_collections
//https://news-at.zhihu.com/api/4/news/latest
Comments | NOTHING