使用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>

请参考

 

广告
将在 10 秒后关闭
bannerAds