TypeScript-ReactAndWebpack

參考來源

React & Webpack

React & Webpack

這一個篇章會帶你使用 TypeScript 使用 webpack 開發 React

如果你還不知道如何初始化一個新的 React 可以參考這篇文章

換句話說,我們假設你已經會使用 nodejs 和 npm

Lay out the project

開始建立一個新的資料夾 proj

1
mkdir proj && cd proj

然後我們建立一個新的資料結構

1
2
3
4
proj/
├─ dist/
└─ src/
└─ components/

TypeScript 放置於 src 的資料夾中,經過 TypeScript compiler 後再經由 Webpack 最後在 dist 產生一個 bundle.js 的檔案,每一個 components 都會放在 src/components 的資料夾內

初始化專案

1
2
3
$ yarn init
$ yarn add react react-dom
$ yarn add @types/react @types/react-dom -D

types/ 這類的套件代表我們需要他取得 TypeScript 的宣告,通常當你 import 一個套件路徑 react,才找得到 react 的套件,然而並不是所有套件都需要這種宣告套件
,然而並不是所有套件都需要這種宣告套件

安裝開發用套件

1
$ yarn add typescript awesome-typescript-loader source-map-loader -D

這兩個套件一起幫你編譯你的程式碼, awesome-typescript-loader 會依據 tsconfig.json 這個檔案所描述的 TypeScript 標準來做編譯。

source-map-loader 可以在你開發的時候可以做編譯前與編譯後的 mapping 方便追蹤錯誤的程式碼

增加 TypeScript 設定檔案

若你希望你的 TypeScript 整合在一起,你需要一個 tsconfig.json

1
2
3
4
5
6
7
8
9
10
11
{
"compilerOptions": {
"outDir": "./dist/",
"sourceMap": true,
"noImplicitAny": true,
"module": "commonjs",
"target": "es5",
"jsx": "react"
},
"include": ["./src/**/*"]
}

若是你希望學習更多的 tsconfig.json 可以參考這篇文章

範例程式

src/components 建立一個新的 Hello.tsx

1
2
3
4
5
6
7
8
9
10
11
12
import * as React from "react";

export interface HelloProps {
compiler: string;
framework: string;
}

export const Hello = (props: HelloProps) => (
<h1>
Hello from {props.compiler} and {props.framework}!
</h1>
);

然後在 src 中新增一個 index.tsx

1
2
3
4
5
6
7
8
9
import * as React from "react";
import * as ReactDOM from "react-dom";

import { Hello } from "./components/Hello";

ReactDOM.render(
<Hello compiler="TypeScript" framework="React" />,
document.getElementById("example")
);

index.tsx 中只是引入了 Hello.tsx 然後將 Hello component 顯示在頁面上

為了顯示這個 component 我們需要建立一個 index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Hello React!</title>
</head>
<body>
<div id="example"></div>

<!-- Dependencies -->
<script src="./node_modules/react/umd/react.development.js"></script>
<script src="./node_modules/react-dom/umd/react-dom.development.js"></script>

<!-- Main -->
<script src="./dist/bundle.js"></script>
</body>
</html>

建立一個 webpack 設定檔案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
module.exports = {
entry: "./src/index.tsx",
output: {
filename: "bundle.js",
path: __dirname + "/dist"
},
devtool: "source-map",
resolve: {
extensions: [".ts", ".tsx", ".js", ".json"]
},
module: {
rules: [
{ test: /\.tsx?$/, loader: "awesome-typescript-loader" },
{ enforce: "pre", test: /\.js$/, loader: "source-map-loader" }
]
},
externals: {
react: "React",
"react-dom": "ReactDOM"
}
};

你可能會好奇 externals 這個欄位在做什麼的?

我們希望在打包的時候希望可以共用一些 package 就好像 global variable 就像 jQuery 或是 _ 一樣

這叫做 namespace pattern, webpack 允許我們使用這個方式來引用套件。

1
$ webpack
文章目录
  1. 1. 參考來源
  2. 2. React & Webpack
    1. 2.1. Lay out the project
    2. 2.2. 初始化專案
    3. 2.3. 增加 TypeScript 設定檔案
    4. 2.4. 範例程式
    5. 2.5. 建立一個 webpack 設定檔案
|