介绍

TypescriptTypeScript是一种由微软开发的开源、跨平台的编程语言。 他是JavaScript的超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程,遵循最新的ES5、ES6规范。

React是一个用于构建用户界面的JavaScript库,起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源。React拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。

Webpack是当前前端最热门的前端资源模块化管理和打包工具

项目初始化

初始化项目结构

1
2
3
mkdir react-ts-ui

cd react-ts-ui

Typescript文件会放在src文件夹里,通过TypeScript编译器编译,然后经webpack处理,最后生成一个bundle.js文件放在dist目录下。 我们自定义的组件将会放在 src/components文件夹下。

1
2
3
4
mkdir src
cd src
mkdir components
cd ..

项目结构

1
2
3
4
react-ts-ui/
├─ dist/
└─ src/
└─ components/

初始化工程

1
2
// ./react-ts-ui
npm init

Typescript

安装Typescript依赖

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

在根目录下创建tsconfig.json文件

这里可以查看tsconfig文件详细说明

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

React

安装React依赖

1
yarn add react react-dom @types/react @types/react-dom

编写React组件

1
2
3
4
5
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.html文件

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

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

Webpack

安装Webpack依赖

1
npm i -g webpack

在根目录下创建webpack.config.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//webpack.config.js
module.exports = {
entry: "./src/index.tsx",
output: {
filename: "bundle.js",
path: __dirname + "/dist"
},

// Enable sourcemaps for debugging webpack's output.
devtool: "source-map",

resolve: {
// Add '.ts' and '.tsx' as resolvable extensions.
extensions: [".ts", ".tsx", ".js", ".json"]
},

module: {
rules: [
// All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.
{ test: /\.tsx?$/, loader: "awesome-typescript-loader" },

// All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
{ enforce: "pre", test: /\.js$/, loader: "source-map-loader" }
]
}
};

需要注意一点我们是从node_modules引入的文件。 React和React-DOM的npm包里包含了独立的 .js文件,你可以在页面上引入它们,这里我们为了快捷就直接引用了。 可以随意地将它们拷贝到其它目录下,或者从CDN上引用。

  • awesome-typescript-loader
    • 可以让Webpack使用TypeScript的标准配置文件 tsconfig.json编译TypeScript代码。npm_url
  • source-map-loader
    • 使用TypeScript输出的sourcemap文件来告诉webpack何时生成 自己的sourcemaps。 这就允许你在调试最终生成的文件时就好像在调试TypeScript源码一样。npm_url

如果有css文件需要打包就需要引用以下两个包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//webpack.config.js
module.exports = {
//...
module: {
rules: [
// All files with a '.ts' or '.tsx' extension will be handled by 'awesome-typescript-loader'.
{ test: /\.tsx?$/, loader: "awesome-typescript-loader" },

// All output '.js' files will have any sourcemaps re-processed by 'source-map-loader'.
{ enforce: "pre", test: /\.js$/, loader: "source-map-loader" },

{ test: /\.css$/,use: ['style-loader','css-loader'] }
]
},
  • css-loader
    • 用于将css文件打包到js文件中。npm_url
  • style-loader
    • 将打包进js文件的css插入页面中。npm_url

配置本地服务器

webpack-dev-server是一个小型的node.js Express服务器,它使用webpack-dev-middleware中间件来为通过webpack打包生成的资源文件提供Web服务。

全局安装webpack-dev-server

1
npm i -g webpack-dev-server

修改webpack.config.js配置文件

1
2
3
4
5
6
7
8
9
//webpack.config.js
module.exports = {
devServer:{
open: true,
port: 9000,
static:{
directory:__dirname
}
},

启动服务器

1
webpack serve

创建站点页面

html-webpack-plugin简化了 HTML 文件的创建,以便为你的 webpack 包提供服务。这对于那些文件名中包含哈希值,并且哈希值会随着每次编译而改变的 webpack 包特别有用。你可以让该插件为你生成一个 HTML 文件,使用 lodash 模板提供模板,或者使用你自己的 loader。

安装插件包

1
yarn add -D html-webpack-plugin

修改webpack.config.js配置文件

1
2
3
4
5
6
7
8
9
10
//webpack.config.js
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
plugins: [
new HtmlWebpackPlugin({
template: 'index.html',//选择的模板
filename: 'index.html',//指定创建的html文件名
})
],
};

热加载

修改webpack.config.js配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var webpack = require('webpack');
module.exports = {
plugins:[
//...
new webpack.HotModuleReplacementPlugin()
]
};

if (module.hot) {
module.hot.accept(err => {
if (err) {
console.error('Cannot apply HMR update.', err);
}
});
}