参考案例

前端技术栈:React + react-router + axios + Typescript + Recoil + Hooks + Cssnext
后端技术栈: BFF + Node + Koa + Serverless + 函数计算 + OSS
细节相关:

  • 微信扫码
  • markdown 渲染
  • 防爬虫
  • pdf渲染

项目搭建

  1. mkdir hooome
  2. cd hooome
  3. yarn init -y

1. 项目入口

入口文件src/index.html
技巧:src/index-dev.html直接引入react避免本地对react的打包 <script src="localhost:js/react.js"></script>

  1. // src/index-prod.html
  2. <div id="app"></div>

2. scripty快捷shell命令

命令优化, 代替 npx webpack serve --mode=development ./config/webpack.base.js
执行 yarn clint:dev,按照script/clint/dev 路径寻找文件。其他环境执行类似。

  1. // scripts/client/dev.sh
  2. webpack serve --mode development

error: because it was not readable/executable
解决: chmod -R 766 scripts

3. webpack5配置

具体配置项, 参见webpack5官方文档

基础配置项 dev prod
entry 入口
output 出口
module
plugins
externals
resolve(alias、extensions)
mode
output
devServer
devtool
plugin(HtmlWebpackPlugin)
mode
optimization (压缩、分割、抽离)
plugin

⚠️ 默认执行根目录 webpack.config.js 文件
其他配置文件:

  • .babelrc
  • postcss.config.js
  • tsconfig.json (tsc —init)

4. label -> react + ts

  1. // rules
  2. {
  3. test: /\.(js|jsx|ts|tsx)/,
  4. include: [resolve('src')],
  5. exclude: /node_modules/,
  6. loader: "babel-loader"
  7. },
  8. // .babelrc
  9. {
  10. "presets": [
  11. [
  12. "@babel/preset-env"
  13. ],
  14. "@babel/preset-react",
  15. "@babel/preset-typescript"
  16. ]
  17. }

5. postcss

⚠️ loader的顺序为自右向左

  1. // rules
  2. {
  3. test: /\.(.css|scss)$/,
  4. use: cssLoders
  5. },
  6. const cssLoders = [
  7. MiniCssExtractPlugin.loader,
  8. {
  9. loader: "css-loader",
  10. options: {
  11. importLoders: 1 // 指定是否需要第三方解析
  12. }
  13. },
  14. {
  15. loader: "postcss-loader",
  16. }
  17. ];
  18. // postcss.config.js
  19. module.exports = {
  20. plugins: {
  21. "post-css-preset-env": {
  22. stage: 0,
  23. feature: {
  24. "nestting-rules": true
  25. }
  26. }
  27. }
  28. }

业务实现

路由

recoil数据管理

公共组件

公共函数

接口对接

antd

swiper

打包发布

附件

插件版本

  1. yarn add webpack webpack-cli webpack-dev-server -D
  2. ├─ webpack-cli@4.7.2
  3. ├─ webpack-dev-server@3.11.2
  4. └─ webpack@5.40.0
  5. yarn add webpack-merge -D //合并
  6. └─ webpack-merge@5.8.0
  7. yarn add scripty -D
  8. └─ scripty@2.0.0
  9. yarn add yargs-parser -D // 解析参数
  10. └─ yargs-parser@20.2.9
  11. yarn add html-webpack-plugin -D
  12. └─ html-webpack-plugin@5.3.2
  13. yarn add clean-webpack-plugin -D
  14. └─ clean-webpack-plugin@4.0.0-alpha.0
  15. yarn add @babel/core @babel/preset-env @babel/preset-react babel-loader
  16. ├─ @babel/core@7.14.6
  17. ├─ @babel/preset-env@7.14.7
  18. ├─ @babel/preset-react@7.14.5
  19. └─ babel-loader@8.2.2
  20. yarn add postcss-loader postcss-preset-env css-loader mini-css-extract-plugin -D
  21. ├─ css-loader@5.2.6
  22. ├─ mini-css-extract-plugin@1.6.1
  23. ├─ postcss-loader@6.1.0
  24. └─ postcss-preset-env@6.7.0
  25. yarn add optimize-css-assets-webpack-plugin -D
  26. └─ optimize-css-assets-webpack-plugin@6.0.1
  27. yarn add typescript
  28. └─ typescript@4.3.4
  29. yarn add @babel/preset-typescript -D
  30. └─ @babel/preset-typescript@7.14.5
  31. yarn add react react-dom react-router-dom
  32. └─ react@17.0.2
  33. ├─ react-dom@17.0.2
  34. └─ react-router-dom@5.2.0
  35. yarn add @types/react @types/react-dom @types/react-router-dom -D
  36. ├─ @types/react-dom@17.0.8
  37. └─ @types/react-router-dom@5.1.7
  38. yarn add recoil axios
  39. ├─ axios@0.21.1
  40. └─ recoil@0.3.1
  41. yarn add qs
  42. └─ qs@6.10.1
  43. yarn add swiper
  44. └─ swiper@6.7.5

参考:

基于webpack5起步教程, 有略微差异https://www.youtube.com/watch?v=X1nxTjVDYdQ