使用Docker构建React + TypeScript的环境
使用React和TypeScript来构建一个Docker环境。本次我们将创建一个在localhost上显示”Hello World”的程序。
目录的组成如下
├── src
│ ├── index.html
│ └── Main.tsx
├── package.json
├── webpack.config.js
└── docker-compose.yml
每个文件的内容如下:
首先,我们要用TypeScript和React来创建一个输出HelloWorld的程序。
- 创建仅包含root块的HTML文件。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<div id="root"></div>
</body>
</html>
创建一个仅将”Hello World”显示在屏幕上的TypeScript文件。
import React from 'react';
import ReactDOM from 'react-dom';
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
3. package.json文件的设置如下:
{
"name": "book-app",
"version": "1.0.0",
"description": "Book Application",
"main": "./src/Main.tsx",
"scripts": {
"build": "webpack",
"start": "webpack-dev-server"
},
"author": "hato",
"dependencies": {
"html-webpack-plugin": "^5.5.0",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"ts-node": "^10.9.1",
"typescript": "^5.0.2"
},
"devDependencies": {
"@babel/core": "^7.22.9",
"@babel/preset-env": "^7.18.6",
"@babel/preset-react": "^7.18.6",
"@babel/preset-typescript": "^7.22.5",
"@types/node": "^18.15.3",
"@types/react": "^18.2.17",
"@types/react-dom": "^18.2.7",
"babel-loader": "^8.2.5",
"webpack": "^5.73.0",
"webpack-cli": "^4.10.0",
"webpack-dev-server": "^4.9.3"
},
"babel": {
"presets": [
"@babel/preset-env",
"@babel/preset-react",
"@babel/preset-typescript"
]
}
}
在webpack.config.js中编写构建设置
const HtmlWebpackPlugin = require('html-webpack-plugin'); //installed via npm
const webpack = require('webpack'); //to access built-in plugins
const path = require('path');
module.exports = {
mode: 'development',
entry: path.resolve(__dirname, './src/Main.tsx'),
output: {
path: path.resolve(__dirname, './dist'),
filename: 'bundle.js'
},
devServer: {
port: 3000,
static: {
directory: path.resolve(__dirname, "./dist"),
}
},
resolve: {
modules: [path.resolve(__dirname, "src"), "node_modules"],
extensions: ['.js', '.jsx', ".ts", ".tsx"]
},
module: {
rules: [
{
test: /\.tsx$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader'
}
},
]
},
plugins: [
new HtmlWebpackPlugin({ template: './src/index.html' })
]
};
Docker的设置
Docker的compose文件配置如下。
version: '3.8'
services:
book_co_web:
image: node:18-alpine
container_name: book_co_web
volumes:
- ./:/app
working_dir: /app
command: >
sh -c "npm install && npm start"
ports:
- "3000:3000"
执行程序
在终端上执行以下命令。
docker compose up
如果执行结果如下所示,则表示成功。访问localhost:3000,即可看到显示“Hello World”的页面。
[+] Running 1/0
✔ Container book_co_web Recreated 0.1s
Attaching to book_co_web
book_co_web |
book_co_web | up to date in 11s
book_co_web |
book_co_web | 55 packages are looking for funding
book_co_web | run `npm fund` for details
book_co_web |
book_co_web | > book-app@1.0.0 start
book_co_web | > webpack-dev-server
book_co_web |
book_co_web | <i> [webpack-dev-server] Project is running at:
book_co_web | <i> [webpack-dev-server] Loopback: http://localhost:3000/
book_co_web | <i> [webpack-dev-server] On Your Network (IPv4): http://172.19.0.2:3000/
book_co_web | <i> [webpack-dev-server] Content not from webpack is served from '/app/dist' directory
book_co_web | asset bundle.js 1.37 MiB [emitted] (name: main)
book_co_web | asset index.html 148 bytes [emitted]
book_co_web | runtime modules 27.5 KiB 13 modules
book_co_web | modules by path ./node_modules/ 1.25 MiB
book_co_web | modules by path ./node_modules/webpack-dev-server/client/ 71.8 KiB 16 modules
book_co_web | modules by path ./node_modules/webpack/hot/*.js 5.3 KiB 4 modules
book_co_web | modules by path ./node_modules/html-entities/lib/*.js 81.8 KiB 4 modules
book_co_web | modules by path ./node_modules/react/ 85.7 KiB 2 modules
book_co_web | modules by path ./node_modules/react-dom/ 1000 KiB 2 modules
book_co_web | modules by path ./node_modules/scheduler/ 17.3 KiB
book_co_web | ./node_modules/scheduler/index.js 198 bytes [built] [code generated]
book_co_web | ./node_modules/scheduler/cjs/scheduler.development.js 17.1 KiB [built] [code generated]
book_co_web | ./node_modules/ansi-html-community/index.js 4.16 KiB [built] [code generated]
book_co_web | ./node_modules/events/events.js 14.5 KiB [built] [code generated]
book_co_web | ./src/Main.tsx 174 bytes [built] [code generated]
book_co_web | webpack 5.88.2 compiled successfully in 2512 ms
赠品
不使用YAML文件,而是使用DockerFile进行编写,则语法会变成这样的样式。
FROM node:18-alpine
COPY . .
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]
指令的执行方式如下
docker build -t book-app:1.0 .
docker run -p 3000:3000 --name book <imagename>
请参考