一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - React - 從頭寫React-like框架的工程搭建實現(xiàn)

從頭寫React-like框架的工程搭建實現(xiàn)

2022-03-02 16:32Showonne React

這篇文章主要介紹了從頭寫React-like框架的工程搭建實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

最近在網(wǎng)上看到了 Build your own React 這篇文章,作者從零開始實現(xiàn)了一個簡易類 React 框架,雖然沒有過多的優(yōu)化,但 React 中的核心思想 Concurrent Mode,F(xiàn)iber Reconciler 等都有實現(xiàn),看完后對理解 React 有很大幫助,因此我想在 Build your own React 的基礎(chǔ)上,對代碼進行拆分,搭建起自己的框架工程,然后完善教程中沒完成的其他功能,代碼在 rac 中。

工程搭建

技術(shù)棧上我選擇用 TypeScript 開發(fā),Rollup 打包, 都是平時用的不多的技術(shù),順帶一起練練手,而且相比 webpack, rollup 配置更簡單一些。在工程中創(chuàng)建一個 tsconfig.json 和一個 rollup.config.js, 然后安裝一下需要的 rollup 插件,比如 rollup-plugin-typescript2, rollup-plugin-terser。另外準(zhǔn)備一個 examples 文件夾,創(chuàng)建一個小型的 demo 工程,使用 tsx 開發(fā)

支持 jsx

如果想讓 TypeScript 支持 jsx,需要在 tsconfig 中開啟 jsx TypeScript 自帶了三種模式: preserve, react,和 react-native,我們設(shè)置為 react, TypeScript 就會將代碼中的 jsx 翻譯成 React.createElement,這也是在使用 jsx 時,React 必須要在作用域中的原因。

但是我們要自己實現(xiàn)一個 React-like 框架,完全可以給 React.createElement 換個名字。在 Build your own React 中,作者通過 /** @jsx Didact.createElement */ 注釋,告訴編譯器將 jsx 的輸出函數(shù)改為 Didact.createElement,這個方法只對當(dāng)前文件生效,如果是在工程中使用為每個文件都加一行注釋就麻煩了。我們通過另一種辦法,在 tsconfig 中通過 jsxFactory 屬性指定,我們這里叫 h,除了 React.createEmenent,還有個特殊元素 - Fragment,TypeScript 默認會翻譯成 React.Fragment,我們通過 jsxFragmentFactory 直接改為 Fragment。

tsconfig.json:

?
1
2
3
4
5
6
7
8
9
10
11
12
{
  "compilerOptions": {
    "target": "esnext",
    "module": "commonjs",
    "moduleResolution": "node",
    "jsx": "react", // enable jsx
    "jsxFactory": "h", // React.createElement => h
    "jsxFragmentFactory": "Fragment", // React.Fragment => Fragment
    "rootDir": "./src",
    "lib": ["dom", "es2015"]
  }
}

Rollup 配置

Rollup 的配置比較簡單,除了 input,output,再額外加一些插件就可以了:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const path = require('path')
const typescript = require('rollup-plugin-typescript2')
const { terser } = require('rollup-plugin-terser')
const eslint = require('@rollup/plugin-eslint')
 
export default {
  input: 'src/index.ts',
  output: [
    { file: 'dist/rac.umd.js', format: 'umd', name: 'rac' }
  ],
  plugins: [
    terser(),
    eslint({
      throwOnError: true,
      include: ['src/**/*.ts']
    }),
    typescript({
      verbosity: 0,
      tsconfig: path.resolve(__dirname, 'tsconfig.json'),
      useTsconfigDeclarationDir: true
    })
  ]
}

Eslint in TypeScript

為了能讓 Eslint 支持 TypeScript,需要給 Eslint 一些額外配置:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
module.exports = {
  parser: '@typescript-eslint/parser',
  env: {
    es6: true,
    browser: true
  },
  plugins: [
    '@typescript-eslint'
  ],
  extends: [
    'eslint:recommended',
  ],
  parserOptions: {
    sourceType: 'module'
  },
  rules: {
    ...
  }
}

項目結(jié)構(gòu)

React 新的 Fiber 架構(gòu)有幾個核心概念,在 Build your own React 中,作者依照

  • Step I: The createElement Function
  • Step II: The render Function
  • Step III: Concurrent Mode
  • Step IV: Fibers
  • Step V: Render and Commit Phases
  • Step VI: Reconciliation
  • Step VII: Function Components
  • Step VIII: Hooks

這幾步逐步實現(xiàn)了一個 mini React,為了提高代碼可讀性和可維護性,會把這些功能劃分到不同的文件中:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
.
├── README.md
├── examples  // demo目錄
├── package.json
├── rollup.config.js
├── src
│   ├── dom.ts
│   ├── h.ts
│   ├── hooks.ts
│   ├── index.ts
│   ├── reconciler.ts
│   ├── scheduler.ts
│   └── type.ts
└── tsconfig.json
  • dom.ts 中處理 DOM 相關(guān)工作
  • h.ts 中是對 jsxFactory, jsxFragmentFactory 的實現(xiàn)
  • hooks.ts 中是對 hooks 的實現(xiàn)
  • reconciler.ts 是 reconcile 階段和 commit 階段的實現(xiàn)
  • shceduler.ts 是任務(wù)調(diào)度器的實現(xiàn)
  • type.ts 是一些類型定義

到這工程就搭建起來了,整個工程的結(jié)構(gòu)和一些代碼實現(xiàn)上借鑒了 fre 這個框架。

到此這篇關(guān)于從頭寫React-like框架的工程搭建實現(xiàn)的文章就介紹到這了,更多相關(guān)React-like搭建內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://segmentfault.com/a/1190000039668066

延伸 · 閱讀

精彩推薦
  • React使用 React 和 Threejs 創(chuàng)建一個VR全景項目的過程詳解

    使用 React 和 Threejs 創(chuàng)建一個VR全景項目的過程詳解

    這篇文章主要介紹了使用 React 和 Threejs 創(chuàng)建一個VR全景項目的過程詳解,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒...

    Windy Z11092022-02-23
  • React100行代碼實現(xiàn)React核心調(diào)度功能

    100行代碼實現(xiàn)React核心調(diào)度功能

    想必大家都知道React有一套基于Fiber架構(gòu)的調(diào)度系統(tǒng),本文會用100行代碼實現(xiàn)這套調(diào)度系統(tǒng),讓你快速了解React的調(diào)度原理。...

    魔術(shù)師卡頌10672021-12-16
  • ReactReact服務(wù)端渲染原理解析與實踐

    React服務(wù)端渲染原理解析與實踐

    這篇文章主要介紹了React服務(wù)端渲染原理解析與實踐,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們...

    隱冬8032022-02-10
  • Reactreact中常見hook的使用方式

    react中常見hook的使用方式

    這篇文章主要介紹了react中常見hook的使用方式與區(qū)別,幫助大家更好的理解和學(xué)習(xí)使用react,感興趣的朋友可以了解下...

    一顆冰淇淋8832022-02-25
  • ReactReact中使用Vditor自定義圖片詳解

    React中使用Vditor自定義圖片詳解

    這篇文章主要介紹了React中使用Vditor自定義圖片詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們...

    淺夏晴空10042021-12-20
  • ReactReact antd tabs切換造成子組件重復(fù)刷新

    React antd tabs切換造成子組件重復(fù)刷新

    這篇文章主要介紹了React antd tabs切換造成子組件重復(fù)刷新,需要的朋友可以參考下...

    一堆亂碼4672022-02-22
  • React簡單分析React中的EffectList

    簡單分析React中的EffectList

    這篇文章主要簡單分析了React中的EffectList,幫助大家更好的理解和學(xué)習(xí)使用React進行前端開發(fā),感興趣的朋友可以了解下...

    zhangyu8172022-02-24
  • ReactReact如何利用Antd的Form組件實現(xiàn)表單功能詳解

    React如何利用Antd的Form組件實現(xiàn)表單功能詳解

    這篇文章主要給大家介紹了關(guān)于React如何利用Antd的Form組件實現(xiàn)表單功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的...

    GuanJdoJ7972022-03-01
主站蜘蛛池模板: 无人区乱码区1卡2卡三卡在线 | 色哺乳妇hd | 女人和男人搞基 | 国产激情视频网站 | 爱情岛论坛自拍永久入口 | 美女被爆 | 91欧美秘密入口 | 日韩成人在线视频 | 国产欧美成人不卡视频 | 4p高h三男一女 | 好男人在线观看免费高清2019韩剧 | 动漫美女被羞羞产奶 | 国产一卡二卡3卡4卡四卡在线 | 国产嘿咻 | 天天做天天爱天天操 | 国产大胆歌舞团网站 | 袖珍人与大黑人性视频 | 免费国产高清精品一区在线 | 国产日韩欧美 | 91精品国产麻豆国产自产在线 | 精品精品国产yyy5857香蕉 | 双性双根 | 日本不卡一区二区三区在线观看 | 久久91精品国产91久 | 97色轮| 性xxxx欧美高清 | avtt在线观看 | 大学生按摩黄a级中文片 | 鸥美三级| 色呦呦网 | 欧美xxxxx九色视频免费观看 | 国产成人免费 | 亚洲国产综合自在线另类 | 欧美精品日韩一区二区三区 | 男人使劲躁女人小视频 | 激情另类国内一区二区视频 | 亚洲 综合 欧美在线 热 | 免费被黄网站在观看 | 好大好爽好硬 | 精品第一国产综合精品蜜芽 | 亚洲色欲色欲综合网站 |