从0到1使用Webpack5 + React + TS借助于标准化应用
发布时间:2024-02-03
"react-dom": "1]18.2.0" // 熟练都听得懂
},
"devDependencies": {
// babel全家桶
"@babel/core": "1]7.18.10",
"@babel/plugin-proposal-class-properties": "1]7.18.6", // React class大力支持
"@babel/plugin-transform-runtime": "1]7.18.10", // 比如说合成 Babel的注入编译器,尽量避免多次重复载入,减少量
"@babel/preset-env": "1]7.18.10", // 发放的预设,意味着我们用作月所的JaScript
"@babel/preset-react": "1]7.18.6", // react大力支持
// ts特性检查和
"@types/node": "1]18.6.4",
"@types/react": "1]18.0.15",
"@types/react-dom": "1]18.0.6",
// @types 段落的是对应包内的 TypeScript 特性表示遗憾
"@typescript-eslint/eslint-plugin": "1]5.33.0",
"@typescript-eslint/parser": "1]5.33.0",
// webpack loader:解析对应明文
"csv-loader": "1]3.0.5",
"sass-loader": "1]13.0.2",
"xml-loader": "1]1.2.1",
"ts-loader": "1]9.3.1",
"less-loader": "1]11.0.0",
// eslint全家桶
"eslint": "1]8.21.0",
"eslint-config-ali": "1]14.0.1", // ali侧边一般性
"eslint-config-prettier": "1]8.5.0", // 关停所有过分或可能与[Prettier]紧张局势的比赛规则
"eslint-import-resolver-typescript": "1]3.4.0", // 添加 ts 语言大力支持 eslint-plugin-import
"eslint-plugin-import": "1]2.26.0", // ES6+ import/export 语言大力支持
"eslint-plugin-prettier": "1]4.2.1", // prettier语言大力支持
"eslint-plugin-react": "1]7.30.1", // react语言大力支持
"eslint-plugin-react-hooks": "1]4.6.0", // hooks语言大力支持
"eslint-webpack-plugin": "1]3.2.0",
// webpack plugin
"fork-ts-checker-webpack-plugin": "1]7.2.13", // 尽量避免webpack当中扫描ts特性
"html-webpack-plugin": "1]5.5.0", // 简便HTML明文的创建人 ,为了让webpack包内涵hash的bundle用作
"mini-css-extract-plugin": "1]2.6.1", // css拆分
"optimize-css-assets-webpack-plugin": "1]6.0.1", // css叠加
"terser-webpack-plugin": "1]5.3.3", // 用作 terser 叠加 js (terser 是一个管理和叠加 ES6+ 的用以)
"webpack-bundle-yzer": "1]4.5.0", // webpack了了量可视立体化归纳
"webpack-cli": "1]4.10.0", // 发放栏杆命令
"webpack": "1]5.74.0", // webpack涡轮
"webpack-dev-server": "1]4.9.3", // 开发设计周边环境的live server
// 用以
"husky": "1]8.0.1", // 重启时固定式 Git hooks 钩子
"less": "1]4.1.3", // css特性
"sass": "1]1.54.3", // css特性
"typescript": "1]4.7.4", // ts
"lint-staged": "1]13.0.3", // 对置放的git明文开始运行linter
// prettier JPEG立体化
"prettier": "1]2.7.1",
"pretty-quick": "1]3.1.3", // 在更加动的明文上开始运行 prettier
}
充分利用步骤
一新项目初始立体化
首先以从一个空清单开始,对一新项目初始立体化:
mkdir demo
cd demo
git init
npm init
React和Babel过渡到
对于一个React一新项目,我们首先以要外置React,写到一个Hello World!
外置我们主要的一新项目缺少:
tnpm i -S react react-dom
由于我们的浏览器不大力支持月所的ECMAScript语言,所以我们不必Babel来英语单词为ES5或者ES6。
外置我们的Babel来改善相容性性:
tnpm i -D @babel/core babel-preset-env babel-preset-react @babel/plugin-proposal-class-properties
@babel/core: babel编解码的基本涡轮 babel-preset-env: 添加对ES5、ES6的大力支持 babel-preset-react: 添加对JSX的大力支持 @babel/plugin-proposal-class-properties: 对React当中class的大力支持Webpack过渡到
tnpm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin
webpack: webackJaScript的基本缺少 webpack-cli: 为JaScript发放命令行用以 webpack-dev-server: 协助重启live server html-webpack-plugin: 协助创建人HTML旧版本Babel固定式
.babelrc当中添加基本固定式:
{
"presets": ["@babel/react", "@babel/env"],
"plugins": ["@babel/plugin-proposal-class-properties"]
}
Babel Plugin
Babel是编译器电子元件,借助Babel,我们可以用作最流行的js写到法,而plugin就是充分利用Babel机制的基本。
这里头的固定式是为了大力支持react当中class的写到法。
Babel Preset
Babel的Plugin一般另加尽可能小的粒度,开发设计者可以按须引进,例如ES6到ES5的机制,正式发放了20+JaScript,这样可以改善稳定性和扩张性,但是很多时候逐一过渡到就很让人头大,而Babel Preset就是为此而生,可以看做Presets是相关Plugins的集合。
@babel/react: 大力支持了React所有的编解码所须 @babel/env: 不夸张液懂,大部分不必它自己内部的固定式项,就可以顺利完成现代JS建筑工程几乎所有的编解码所须Webpack基本固定式
一新建一个webpack.config.js明文。
//webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
entry: './src/index.js',
output: {
path: path.join(紧接dirname, '/dist'),
filename: 'bundle.js'
},
devServer: {
port: 8080
},
module: {
rules: [
{
test: /.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
},
{
test: /.css$/,
use: [ 'style-loader', 'css-loader' ]
}
]
},
plugins:[
new HtmlWebpackPlugin({
template: path.join(紧接dirname,'/src/index.html')
})
]
}
entry: 正对面,开始了了的起点站 output: 了了明文的URL devServer: live server固定式 test: 用作loader的明文特性 loader: 正要用作的loaderPackage.json基本固定式
"start": "webpack serve 便是mode development 便是open 便是hot",
"build": "webpack 便是mode production"
mode: process.env.NODE_ENV 便是> development, 为modules和chunks启用有意义的命名 open: 告诉server在服务重启后打开表单浏览器 hot: 掀开微更加一新写到一个React Demo
现有的一新项目结构如下布标明:
js和html明文如下布标明:
之前,只要start一下,一新项目就才会重启在8080端口。
TypeScript固定式
tnpm install -D typescript ts-loader @types/node @types/react @types/react-dom
typescript: TypeScript的主要涡轮 ts-loader: 英语单词.ts 便是> .js 并了了 @types/node @types/react @types/react-dom: 对node、react、react dom特性的定义同时在根清单加入tsconfig.json来对ts程序编译器来进行固定式:
//_tsconfig.json_
{
"compilerOptions": {
"outDir": "./dist/",
"noImplicitAny": true,
"module": "es6",
"target": "es5",
"jsx": "react",
"allowJs": true,
"allowSyntheticDefaultImports": true,
"moduleResolution": "Node"
}
}
之前在webpack当中添加对ts的大力支持。
添加ts-loader:
//_webpack.config.js_
{
test: /.tsx?$/,
exclude: /node_modules/,
loader: 'ts-loader'
}
新设resolve类型,来而无须明文如何被解析:
//_webpack.config.js_
resolve:
{
extensions: [ '.tsx', '.ts', '.js' ],
}
rename正对面:
//_webpack.config.js_
entry: "./src/index.tsx",
之前重启一下server来看一下ts固定式是否正确。
上述我们的固定式其实相当于执行了一次:
npx create-react-app my-app 便是template typescript
在这种方式上下很是麻烦,将 *.ts 发放给 TypeScript,然后将开始运行的结果发放给 Babel,而且还要借助很多loader。
那么我们能不能简便一下这样的方式上,因为Babel7当中发放的babel-loader就可以极致来进行程序编译器ts,正确是可以的,这种方式直接简便了步骤。
module: {
rules: [
{
test: /.tsx?$/,
exclude: /node_modules/,
loader: ['babel-loader']
}
]
},
并且在.babelrc当中也只多了一行@babel/preset-typescript,这种固定式更加单纯,而且了了速度快更加快一点,自然语言更加加清晰。
那么为什么还要在一新项目当中用作ts-loader呢?
ts-loader 在内部是绑定了 TypeScript 的正式程序编译器器 便是 tsc。所以,ts-loader 和 tsc 是共享 tsconfig.json,所以才会发放零碎的报错电子邮件,ts-loader也与 vscode 发放的语言差分表现一致 而@babel/preset-typescript有的时候才会很难发放零碎的报错电子邮件和特性提示管理海洋资源
webpack 只能了解 JaScript 和 JSON 明文,这是 webpack 开箱须用的自带并能。loader 让 webpack 不必去管控其他特性的明文,并将它们叠加为适当的模组当中。
loader当中,test类型可以标记成哪些明文才会被叠加;use类型可以定义成叠加时,应该是用哪个loader。
CSS、Less、Sass
外置loader:
tnpm i -D less less-loader style-loader css-loader sass sass-loader
webpack固定式:
//_webpack.config.js_
rules: [
{
test: /.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
},
{
test: /.css$/,
use: ['style-loader', 'css-loader'],
},
{
test: /.tsx?$/,
exclude: /node_modules/,
loader: 'ts-loader',
},
{
test: /.(less|css)$/,
exclude: /.module.less$/,
use: [
{
loader: 'css-loader',
options: {
importLoaders: 2,
sourceMap: !!DEV,
},
},
{
loader: 'less-loader',
options: {
sourceMap: !!DEV,
},
},
],
},
{
test: /.(sass|scss)$/,
use: [
{
loader: 'css-loader',
options: {
importLoaders: 2,
sourceMap: !!DEV,
},
},
{
loader: 'sass-loader',
options: {
sourceMap: !!DEV,
},
},
],
},
布表、JSON海洋资源
对于布表和字体,我们可以用作外置的Assets Modules来有趣地把这些细节加到我们的管理系统当中,对于特性,我们可以为了让:
asset/resource 发送一个原则上的明文并推 URL。 asset/inline 推一个海洋资源的 data URI。 asset/source 推海洋资源的源编译器。 asset 在推一个 data URI 和发送一个原则上的明文间重启时为了让。//_webpack.config.js_
module: {
rules: [{
test: /.png/,
type: 'asset/resource'
}]
},
对于其他特性海洋资源,我们不必外置csv-loader、xml-loader等:
//_webpack.config.js_
{
test: /.(csv|tsv)$/i,
use: ['csv-loader'],
},
{
test: /.xml$/i,
use: ['xml-loader'],
},
搭建开发设计周边环境
现有,我们的应用仍然可以正常开始运行tsx明文,并且在本地来进行调试和开发设计,那么我们来看看如何新设一个开发设计周边环境,来使开发设计变得更加加有趣。
//_webpack.config.js_
const { DEV, DEBUG } = process.en
process.env.BABEL_ENV = DEV ? 'development' : 'production';
process.env.NODE_ENV = DEV ? 'development' : 'production';
mode: DEV ? 'development' : 'production',
devtool: DEV && 'source-map',
我们可以从process.env当中获取周边环境表达式来区分开发设计周边环境和原材料周边环境。
当webpack在本地了了编译器时,我们可以用作inline-source-map,可以将程序编译器后的编译器映射回值得肯定源编译器,这样在报错的时候,错误就才会被订为到明确的明文和行数。当然,在原材料周边环境当中,为了必要措施隐私,众所周知把这个新设一个管理系统关掉。
在开发设计周边环境当中,webpack-dev-server才会为你发放一个基本的web server,并且具有实时重一新载入机制。
完善了了固定式与内存
我们期望每次了了都把上次的了了明文删除,可以用作CleanWebpackPlugin:
//_webpack.config.js_
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
plugins: [
new CleanWebpackPlugin(),
]
}
并且,在我们原材料周边环境,我们期望改动后的一Vista可以丢弃内存,并且不想有改动的版本可以延续内存;但是在开发设计周边环境,我们不期望有内存,而是每次都是拿到月所的海洋资源。所以,不必对webpack config花钱一次拆分:分成
webpack.prod.js 原材料周边环境了了固定式 webpack.dev.js 开发设计周边环境了了固定式里头面的区别主要在于了了后的明文命名、sourceMap等。
原材料周边环境
contenthash:只有模组的细节转变,才才会转变hash值:
output: {
filename: 'js/[name].[contenthash:8].js', // contenthash:只有模组的细节转变,才才会转变hash值
},
开发设计周边环境
output: {
filename: 'js/[name].[hash:8].js',
}
稳定性简便
了了归纳用以
可以用作webpack-bundle-yzer来归纳我们了了海洋资源的微小:
const { BundleAnalyzerPlugin } = require('webpack-bundle-yzer');
plugins: [
DEBUG && new BundleAnalyzerPlugin(),
]
同时新设package.json的重启项
海洋资源叠加
OptimizeCSSAssetsPlugin主要用来简便css明文的叠加成,包内括摈弃多次重复的外观设计定义、撕开外观设计比赛规则当中多余的表达式、移除不不必的浏览器前缀等。
TerserPlugin主要用来简便js量,包内括重新命名表达式,甚至是删除整个的访问还好的编译器块。
//_webpack.config.js_
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
optimization: {
minimizer: [
new TerserPlugin({
parallel: false,
terserOptions: {
output: {
comments: false,
},
},
}),
new OptimizeCSSAssetsPlugin({}),
],
minimize: !DEV,
splitChunks: {
minSize: 500000,
cacheGroups: {
vendors: false,
},
},
},
编译器复合
海洋资源复合
1)多正对面
webpack外置的特性不必把编译器复合到不尽相同的bundle 当中,然后可以按须载入或立体化载入这些明文。编译器复合可以用于获取更加小的bundle,以及掌控海洋资源载入服务器端,如果用作必要,才会相当程度冲击载入小时。
//_webpack.config.js_
entry: {
index: './src/index.js',
another: './src/another-module.js',
},
output: {
filename: '[name].bundle.js'
2)Tree Shaking
Webpack5在原材料周边环境仍然集成了Tree Shaking机制,要用的编译器才会被shaking掉:
// _webpack.config.js_
module.exports = {
// ...
mode: 'production',
};
但是在开发设计周边环境当中不必手动固定式(Not Recommend):
// _webpack.config.js_
module.exports = {
// ...
mode: 'development',
optimization: {
usedExports: true,
}
};
处于好奇,webpack是如何极致的避开不想有用作的编译器的呢?
很单纯:就是 Webpack 不想看得见你用作的编译器。Webpack 藏身处整个客户端的import/export 自然语言,因此,如果它看得见导向的东西最终不想有被用作,它才会认为那是未所述编译器(或叫花钱“临终时编译器”—— dead-code ),并才会对其来进行 tree-shaking 。临终时编译器却是也许那么完全一致的。下面是一些例子:
// _test.js_
// 这才会被看作“来生”编译器,不才会花钱 tree-shaking
import { add } from './math'
console.log(add(5, 6))
// 导向但不想有运算符给 JaScript ;也,也不想有在编译器里头用到
// 这才会被当花钱“临终时”编译器,才会被 tree-shaking
import { add, minus } from './math'
console.log('hello webpack')
// 导向整个努,但是不想有运算符给 JaScript ;也,也不想有在编译器里头用到
// 非常寻常,这想不到被当花钱“来生”编译器,因为 Webpack 对努的导向和本地编译器导向的管控方式不尽相同。
import { add, minus } from './math' // 临终时的
import 'lodash' // 来生的
console.log('hello webpack')
所以对于这种三方努我们可以用作下面的Shimming作法。
肯定 Webpack 不能谢霆锋安全地来进行 tree-shaking。有些模组导向,只要被过渡到,就才会对客户端产生重要冲击。一个更好的例子就是当前Objective-C,或者新设当前固定式的JaScript 明文。Webpack 认为这样的明文有“过敏反应”。具有过敏反应的明文不应该花钱 tree-shaking,因为这将毁坏整个应用。比较好的告诉Webpack你的编译器有过敏反应的作法就是在package.json里头面新设sideEffects。
{
"name": "your-project",
"sideEffects": ["./src/some-side-effectful-file.js", "*.css"]
}
3)Shimming受限制缺少
对于上会的lodash努很难被shaking,我们可以用作细粒度shimming受限制的作法来简便,首先以过渡到ProvidePluginJaScript,把客户端当中的模组缺少,改用一个当前表达式缺少,让我们先以移除 lodash 的 import自然语言,改用通过JaScript发放它,并且合成成join作法来当前用作它:
// _src/index.tsx
console.log(join(['hello', 'webpack'], ' '))
// _webpack.config.js_
plugins: [
new webpack.ProvidePlugin({
//_: 'lodash'
// 如果不想注解的话,不必这样所述console.log(_.join(['hello', 'webpack'], ' '))
join: ['lodash', 'join'],
})
]
细粒度Shimming
一些遗留下的模组缺少的this看成的window;也,我们可以用作import-loaders,它对缺少 window ;也下的当前表达式(比如 $ 或 this )的第三方模组非常有用。
CommonJS 自然语言当中,这将才会变成一个疑问,理论上此时的 this看成的是 module.exports。在这种情况下,你可以通过用作 imports-loader隔开 this 看成:
// _webpack.config.js_
module: {
rules: [
{
test: require.resolve('./src/index.js'),
use: 'imports-loader?wrapper=window',
},
]
},
4)公共大部分合成
尽量避免多次重复可以用作splitChunk,合成成编译器当中的公共大部分:
//_webpack.config.js_
minimize: !DEV,
splitChunks: {
minSize: 500000,
cacheGroups: {
vendors: false,
},
},
minSize:形成一个一新编译器块总和的量 cacheGroups:这里头开始新设内存的 chunks5)按须复合
在React一新项目当中,编译器按须复合可以用作如下作法,webpack 把 import() 作为一个复合点(split-point),并把过渡到的模组作为一个原则上的 chunk。import() 将模组名字作为表达式并返回一个 Promoise ;也,即 import(name) -> Promise。
//_index.tsx_
const WdAndDxEntry = lazy(() => import(/* webpackChunkName: "wd-and-dx" */ '../../old-code/component/wd-and-dx/entry'));
const WdAndDxFallback = () => ()
const SSRCompatibleSuspense = (props: Parameters['0']) => {
const isMounted = useMounted();
if (isMounted) {
return ;
}
return <>{props.fallback};
}
return (
}>
className=""
data={data}
style={{
height: 150,
}}
/>
);
6)复合三方努
固定式 dependOn option 表单,这样可以在多个 chunk 间共享模组:
//_webpack.config.js_
module.exports = {
entry: {
index: {
import: './src/index.js',
dependOn: 'shared',
},
another: {
import: './src/another-module.js',
dependOn: 'shared',
},
shared: 'lodash',
}
}
CSS复合
该JaScriptMiniCssExtractPlugin将CSS合成到原则上的明文当中。它为每个包内涵CSS的JS明文创建人一个CSS明文。
//_webpack.config.js_
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
{
test: /.(sass|scss)$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
},
{
loader: 'css-loader',
options: {
importLoaders: 2,
sourceMap: !!DEV,
},
},
{
loader: 'sass-loader',
options: {
sourceMap: !!DEV,
},
},
],
},
DEBUG && new BundleAnalyzerPlugin(),
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[name].css',
}),
改善构建速度快
当一新项目量升高时,程序编译器小时也随之增高。其当中小时小头就是ts的特性扫描为时。ts-loader 发放了一个 transpileOnly 表单,它表单为 false,我们可以把它新设为 true,这样一新项目程序编译器时就不才会来进行特性检查和,也不才会叠加成表示遗憾明文。
//_webpack.config.js_
module: {
rules: [
{
test: /.tsx?$/,
use: [
{
loader: 'ts-loader',
options: {
transpileOnly: true
}
}
]
}
]
}
可以看一下回路这个表单后的前后对比:
掀开检查和前
$ webpack 便是mode=production 便是config ./build/webpack.config.js
Hash: 36308e3786425ccd2e9d
Version: webpack 4.41.0
Time: 2482ms
Built at: 12/20/2019 4:52:43 PM
Asset Size Chunks Chunk Names
app.js 932 bytes 0 [emitted] main
index.html 338 bytes [emitted]
Entrypoint main = app.js
[0] ./src/index.ts 14 bytes {0} [built]
Child html-webpack-plugin for "index.html":
1 asset
Entrypoint undefined = index.html
[0] ./node_modules/html-webpack-plugin/lib/loader.js!./index.html 489 bytes {0} [built]
[2] (webpack)/buildin/global.js 472 bytes {0} [built]
[3] (webpack)/buildin/module.js 497 bytes {0} [built]
+ 1 hidden module
✨ Done in 4.88s.
关停检查和后
$ webpack 便是mode=production 便是config ./build/webpack.config.js
Hash: e5a133a9510259e1f027
Version: webpack 4.41.0
Time: 726ms
Built at: 12/20/2019 4:54:20 PM
Asset Size Chunks Chunk Names
app.js 932 bytes 0 [emitted] main
index.html 338 bytes [emitted]
Entrypoint main = app.js
[0] ./src/index.ts 14 bytes {0} [built]
Child html-webpack-plugin for "index.html":
1 asset
Entrypoint undefined = index.html
[0] ./node_modules/html-webpack-plugin/lib/loader.js!./index.html 489 bytes {0} [built]
[2] (webpack)/buildin/global.js 472 bytes {0} [built]
[3] (webpack)/buildin/module.js 497 bytes {0} [built]
+ 1 hidden module
✨ Done in 2.40s.
From 4.88s 便是> 2.4s,但是缺少了特性检查和。
这里头正式推荐了一个妥善解决方案,用作fork-ts-checker-webpack-plugin,它在一个原则上的进程上开始运行特性检查和器,此JaScript用作 TypeScript 而不是 webpack 的模组解析,有了 TypeScript 的模组解析,我们不必继续前进webpack 程序编译器。可以相当程度较快程序编译器速度快。
//_webpack.config.js_
module: {
rules: [
{
test: /.tsx?$/,
use: [
{
loader: 'ts-loader',
options: {
transpileOnly: true
}
}
]
}
]
},
plugins: [
new ForkTsCheckerWebpackPlugin()
]
用editorconfig分立命令行法规
在根清单一新建.editorconfig须,肯定不要与已有的lint比赛规则紧张局势:
// 紧接.editorconfig紧接
#
root = true
[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[*.md]
trim_trailing_whitespace = false
[makefile]
indent_style = tab
indent_size = 4
Antd固定式
babel当中固定式按须载入:
{
"presets": ["@babel/react", "@babel/env"],
"plugins": [
"@babel/plugin-proposal-class-properties",
[
"import",
{
"libraryName": "antd",
"libraryDirectory": "es",
"style": true // or 'css'
},
"antd"
]
]
}
webpack当中定制主旨:
module: {
rules: [
// 管控 .css
{
test: /.css$/,
use: ['style-loader', 'css-loader'],
},
// 管控 .less
{
test: /.less$/,
use: [
'style-loader',
'css-loader',
// less-loader
{
loader: 'less-loader',
options: {
lessOptions: {
// 更换antd的表达式,去掉 @ 符号须
//
modifyVars: {
'primary-color': '#1DA57A',
},
jascriptEnabled: true, // 大力支持js
},
},
},
],
},
]
}
肯定外观设计不必载入 less JPEG,一个常见的疑问就是过渡到了多份外观设计,less 的外观设计被 css 的外观设计隔开了。
ESlint固定式
ESlint主要机制包内涵编译器JPEG和编译器质量的差分,并且可以固定式pre-commit来法规编译器的审批。
tnpm install -D eslint eslint-webpack-plugin @typescript-eslint/parser @typescript-eslint/eslint-plugin eslint-plugin-react
eslint: eslint主要涡轮 eslint-webpack-plugin: webpack loader @typescript-eslint/parser: 协助ESlint lint ts编译器 @typescript-eslint/eslint-plugin: 包内涵TS扩张比赛规则的JaScript eslint-plugin-react: 包内涵React扩张比赛规则的JaScriptESlint固定式明文
// _eslintrc_
module.exports = {
parser: '@typescript-eslint/parser', // ESlint Parser
extends: [
'plugin:react/recommended', // 从@eslint-plugin-react当中为了让推荐的比赛规则
'plugin:@typescript-eslint/recommended', // 从@typescript-eslint/eslint-plugin为了让推荐的比赛规则
],
parserOptions: {
ecmaVersion: 2018, // 协助转立体化最先以进的ECMAScript机制
sourceType: 'module', // 意味着imports的用法
ecmaFeatures: {
jsx: true, // JSX相容性
},
},
rules: {
},
settings: {
react: {
version: 'detect', // 告诉eslint-plugin-react重启时扫描月所版本的react
},
},
};
Prettier固定式
虽然 ESLint 也可以差分编译器JPEG,但 Prettier 更加娴熟,所以一新项目当中一般才会辅以四人用作。为了尽量避免二者的紧张局势,一般的妥善解决成发点是禁掉 ESLint 当中与 Prettier 紧张局势的比赛规则,然后用作 Prettier 花钱JPEG立体化, ESLint 花钱编译器差分。
prettier固定式明文
{
"arrowParens": "oid",
"bracketSpacing": true,
"embeddedLanguageFormatting": "auto",
"htmlWhitespaceSensitivity": "css",
"insertPragma": false,
"jsxBracketSameLine": true,
"jsxSingleQuote": false,
"printWidth": 100,
"proseWrap": "preserve",
"quoteProps": "as-needed",
"requirePragma": false,
"semi": true,
"singleQuote": true,
"tabWidth": 2,
"trailingComma": "es5",
"useTabs": true,
"vueIndentScriptAndStyle": false
}
编译器审批法规
prettier 只是保证了在通过命令行(vs code)来进行JPEG立体化编译器的时候,JPEG立体化成不必的JPEG(当然可以通过固定式 onSe 在编译器保存时重启时JPEG立体化),但是很难保证全都都才会立即来进行。
因此来进行重启时JPEG立体化笨拙非常重要,而重启时JPEG立体化的是必定会为了让 pre-commit 最恰当,通过 git hook ,不必在 commit 之前JPEG立体化好编译器(如果仍然 commit,才会将置放转为审批,聚合审批详细描述,不必回滚才才会撤销)。
tnpm i -D pretty-quick prettier husky
pretty-quick: 为了让git-hooks来进行编译器扫描,并且fix husky: 可以通过固定式的方式来用作git-hooks,尽量避免手动更改package.json新设
"pretty": "./node_modules/.bin/pretty-quick 便是staged"
"husky": {
"hooks": {
"pre-commit": "tnpm run pretty"
}
},
Webpack零碎固定式
之前贴一下零碎的固定式,因为Aone发布重启时更加一新发行版,所以要用拆分config明文来根据周边环境新设内存,并且固定式仍然尽可能简便,拆分反而才会增高维护效益。
//_webpack.config.js_
//webpack.config.js
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const TerserPlugin = require('terser-webpack-plugin');
const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
const { BundleAnalyzerPlugin } = require('webpack-bundle-yzer');
const ESLintPlugin = require('eslint-webpack-plugin');
const { DEV, DEBUG } = process.en
process.env.BABEL_ENV = DEV ? 'development' : 'production';
process.env.NODE_ENV = DEV ? 'development' : 'production';
module.exports = {
entry: './src/index.tsx',
output: {
path: path.join(紧接dirname, '/dist'),
filename: 'bundle.js',
clean: true,
},
devServer: {
port: 8080,
},
mode: DEV ? 'development' : 'production',
devtool: DEV && 'source-map',
module: {
rules: [
{
test: /.jsx?$/,
exclude: /node_modules/,
loader: 'babel-loader',
},
{
test: /.tsx?$/,
exclude: /node_modules/,
loader: 'ts-loader',
},
{
test: /.css$/,
use: ['style-loader', 'css-loader'],
},
// 管控 .less
{
test: /.less$/,
use: [
'style-loader',
'css-loader',
// less-loader
{
loader: 'less-loader',
options: {
lessOptions: {
// 更换antd的表达式,去掉 @ 符号须
//
modifyVars: {
'primary-color': '#1DA57A',
'border-color-base': '#d9d9d9', // 边框纯白
'text-color': '#d9d9d9'
},
jascriptEnabled: true, // 大力支持js
},
},
},
],
},
{
test: /.(sass|scss)$/,
use: [
{
loader: MiniCssExtractPlugin.loader,
},
{
loader: 'css-loader',
options: {
importLoaders: 2,
sourceMap: !!DEV,
},
},
{
loader: 'sass-loader',
options: {
sourceMap: !!DEV,
},
},
],
},
{
test: /.png/,
type: 'asset/resource',
},
{
test: /.(woff|woff2|eot|ttf|otf)$/i,
type: 'asset/resource',
},
{
test: /.(csv|tsv)$/i,
use: ['csv-loader'],
},
{
test: /.xml$/i,
use: ['xml-loader'],
},
],
},
optimization: {
minimizer: [
new TerserPlugin({
parallel: false,
terserOptions: {
output: {
comments: false,
},
},
}),
new OptimizeCSSAssetsPlugin({}),
],
minimize: !DEV,
splitChunks: {
minSize: 500000,
cacheGroups: {
vendors: false,
},
},
},
resolve: {
modules: ['node_modules'],
extensions: ['.json', '.js', '.jsx', '.ts', '.tsx', '.less', 'scss'],
},
plugins: [
new HtmlWebpackPlugin({
template: path.join(紧接dirname, '/src/index.html'),
filename: 'app.html',
inject: 'body',
}),
DEBUG && new BundleAnalyzerPlugin(),
new MiniCssExtractPlugin({
filename: '[name].css',
chunkFilename: '[name].css',
}),
new ESLintPlugin(),
new ForkTsCheckerWebpackPlugin(),
].filter(Boolean),
};
论述
这篇文章主要详细描述了开发设计步骤当中从一新项目初始立体化开始,再次到一个国际标准侧边一新项目的搭建路程。涉及相关编译器法规、开发设计周边环境搭建、原材料周边环境简便等,意在打造成一个可慢速用作的现代Webpack5.x+React18.x+Typescript+Antd4.x模版,以供在以后的实际企业场景所须当中零效益用作。
推荐阅读
1.生产效能的思考论述
2.关于电子技术并能的思考和论述
3. 如何结构立体化和清晰地来进行表达
紧接著来犯!2022上半年迭云邻里头最微书本榜单!
千万阅读量、百万下载量、上百本书本,据统计200位迭专家投身于编著到。多元立体化为了让、全各个领域隔开,为中心迭巴巴电子技术实证精华,读、懂授、练一键三连。开发设计者藏经阁,开发设计者的工作异性恋~
点击这里头,查看详情。
当中文翻译元数据:
本文为迭云原创细节,而无须意味着不得转载。
。肠炎宁跟妈咪爱能一起吃吗肠炎宁颗粒可以空腹吃吗
肠炎宁和整肠生哪个效果好
再林阿莫西林克拉维酸钾片怎么吃
积大本特治前列腺增生好吗
-
心理试验中:你第一眼喜欢哪款凤冠,测出你的心理素质有多过硬
无意识测试:你第一眼喜欢哪款凤冠,测出你的适应力有多能力也 A:你的适应力极其能力也。你能屈能伸、不卑不亢、百折不悔。因为你性格睿智、心境薄弱、做有事执着、豁达博大。所以你从不不会
- 2025-05-19心理测试:第一眼你羡慕哪款礼服,测出你是否具有致命吸引力
- 2025-05-19花2万元,新建25㎡别墅露台,这么漂亮的屋顶花园,有撩到你么?
- 2025-05-19做豪宅经纪人最大的收获不是佣金,而是能够跟成功人士零距离接触,忘却他们无私的分享,你们说对吧?亿哥 豪宅
- 2025-05-19唐嫣被曝生双胞胎?虽然37岁已迈入中年,但穿搭风格却依然精致
- 2025-05-19看看咖啡色裙子配上衣图,学起时尚搭配
- 2025-05-19住在上亿豪宅里白富美真的太漂亮了,这身材完美,在魔都这样的城市、年薪多少钱的人才可以拥有她啊!杭州 亿哥
- 2025-05-19江疏影身穿墨绿衬衫配直筒裤随性端庄,而一袭羽毛裙高级美艳!
- 2025-05-19初冬新款咖啡色裤子搭配图片
- 2025-05-19娜扎身穿抹胸五彩上衣少女感满满,而拉链露脐毛衣配牛仔文艺清新!
- 2025-05-19身穿绿色运动套装青春活力,而白T配运动外衣打造休闲风!