原文: Getting Started with React TypeScript and Webpack
做者:Grant
譯者:博軒
我會經過這篇文章,爲你們講述,如何使用 React
,TypeScript
和 Webpack
來構建一個項目。html
這是一篇關於如何使用 React
,TypeScript
和 Webpack
來構建一個很是基礎的項目的教程。您能夠繼續閱讀,或者直接在 github 上面查看示例代碼。node
譯註:create-react-app
已經提供了關於TypeScript
開箱即用的支持,也可使用react-scripts
或者react-app-rewired
完成對於Webpack
配置的擴展。本文也只是聊一聊如何從 0 構建一個項目,你們瞭解一下就好 🤣
mkdir your-folder-name && cd your-folder-name && npm init --yes
React
和 React-DOM
的依賴npm install react && npm install react-dom
TypeScript
npm install typescript --save-dev
React
和 React-DOM
的類型npm install @types/react --save-dev && npm install @types/react-dom --save-dev
TypeScript
項目。您應該 tsconfig.json
文件被建立。tsc --init
tsconfig.json
,以後添加一個 include
compilerOptions
。這將告訴 TypeScript
在哪找到咱們的代碼。{ "compilerOptions": { }, "include":[ "./src/**/*" ] }
src
文件夾,並在裏面建立一個 App.ts
文件。export class App { constructor() { console.log("Hello app!"); } }
TypeScript
是經過 tsc
命令在終端中運行編譯。若是成功,您應該看到 src
文件夾下面出現 App.js
的文件。完成後,咱們刪除 .js
文件,繼續後續操做。TypeScript
和 React
一塊兒工做如今,讓咱們看看 TypeScript
是否能夠編譯 React
文件。react
tsconfig.json
文件,內容以下。{ "compilerOptions": { "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ "lib": ["es5", "es6", "dom"], /* Specify library files to be included in the compilation. */ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ "jsx": "react", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ "sourceMap": true, /* Generates corresponding '.map' file. */ "outDir": "./dist/", /* Redirect output structure to the directory. */ "removeComments": true, /* Do not emit comments to output. */ "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ "preserveConstEnums": true }, "include": [ "./src/**/*" ] }
TypeScript
是否能夠轉換 React
文件,咱們將在 src 文件夾中添加一個新文件 Main.tsx
。import * as React from 'react'; import { App } from './App'; export interface IMainProps { app: App; } export class Main extends React.Component<IMainProps, {}> { public render(): JSX.Element { return ( <> <h1>Hello main</h1> </> ); } }
tsc
,您如今應該看到生成了一個 dist
文件夾,切該目錄下有一個 Main.js
文件,這意味着 TypeScript
如今也能夠處理 React TypeScript
文件!(.tsx)如今,咱們須要將 TypeScript
和 React
結合在一塊兒開發。接下來,咱們會使用 Webpack
進行打包,並在瀏覽器中提供服務。webpack
首先,咱們按照Webpack 官方文檔 在本地安裝 Webpack 。git
npm install webpack --save-dev && npm install webpack-cli --save-dev && npm install webpack-dev-server --save-dev && npm install awesome-typescript-loader --save-dev && npm install html-webpack-plugin --save-dev
如今,除了 Webpack
,咱們還安裝了另外4個開發依賴。es6
tsconfig.json
幫助 Webpack
編譯咱們的 TypeScript
代碼。webpack.config.js
文件。const path = require('path'); const HtmlWebPackPlugin = require('html-webpack-plugin'); module.exports = { entry: { app: ['./src/App.ts'], vendor: ['react', 'react-dom'] }, output: { path: path.resolve(__dirname, 'dist'), filename: 'js/[name].bundle.js' }, devtool: "source-map", resolve: { extensions: [".ts", ".tsx", ".js", ".jsx", ".json"] }, module: { rules: [ { test: /\.tsx?$/, loader: "awesome-typescript-loader" } ] }, plugins: [ new HtmlWebPackPlugin({ template: "./src/index.html" }) ] };
entry
包含 App.ts
的文件路徑。entry
還包含 verder
數組,React
和 React-Dom
是咱們惟一的庫,因此咱們在這裏添加它們。若是要添加其餘庫,則應將其添加到此,以便 Webpack 瞭解項目中所須要的依賴。output
對象告訴 webpack
在哪裏打包咱們的應用程序,當前的例子是在 dist
文件夾裏面。module
下咱們添加了 awesome-type-script-loader
。plugins
數組下,咱們使用 HtmlWebPackPlugin
添加了 index.html
源文件。壓縮後的 html
文件將放在咱們的 dist
文件夾中,同時引用咱們打包後的js文件。接下來,新建立一個 index.html
文件並將其添加到咱們的src文件夾中。並確保<div id="app"></div>
已被添加在 index.html
文件中。這是咱們的React應用程序將要渲染的位置。github
App.ts
並在文件的最底部添加 new App()
;export class App { constructor() { console.log("Hello app!"); } } new App();
node_modules/.bin/webpack-dev-server --mode development
如今咱們已經完成了React
,TypeScript
和 Webpack
的組合,讓咱們看一個更加實用一些的 React
示例。web
Main.tsx
文件:import * as React from 'react'; import { App } from './App'; export interface IMainProps { app: App; // Reference to our App.ts class } export class Main extends React.Component<IMainProps, {}> { constructor(props: IMainProps) { super(props); } public render(): JSX.Element { return ( <> Main app </> ); } }
App.ts
文件,並粘貼以下內容:import * as ReactDOM from 'react-dom'; import * as React from 'react'; import { Main } from './Main'; export class App { constructor() { this.render(); } private render(): void { ReactDOM.render(React.createElement(Main, { app: this }), document.getElementById("app")); } } new App();
Main.tsx
類做爲渲染的 React UI 的入口。props
傳遞。可能會在之後的App類中執行或訪問這些內容。app
id 屬性定位 index.html
文件。這也將是React呈現的位置。如今,若是咱們回到瀏覽器,咱們應該在頁面上看到 「Main app」。當咱們更改了一些代碼,您的瀏覽器應該已經自動從新加載。如今 React 已經出如今咱們的網頁中了。typescript
使用 ./node_modules/.bin/webpack-dev-server --mode development
運行項目不是那麼友好。咱們可使用更加便捷的 node
命令。express
修改 package.json
以下:
{ "scripts": { "dev": "webpack-dev-server --mode development", "build": "webpack --mode production" } }
咱們如今能夠在終端上運行上面的命令:
npm run dev
就是咱們以前輸入的內容:./node_modules/.bin/webpack-dev-server --mode development
npm run build
將告訴 webpack
編譯咱們的應用程序用於生產。它將壓縮並打包全部內容到咱們的 dist
文件夾中,準備上傳到網絡。本文已經聯繫原文做者,並受權翻譯,轉載請保留原文連接