如何用Webpack5搭建CRA+TS

233 阅读1分钟

官方提供脚手架工具create-react-app初始化项目时是用react-script(内部也是用webpack)进行打包构建的,现在我们直接用webpack工具对于项目进行配置。

Step 1: Using create-react-app

npx create-react-app my-app --template typescript

Step 2: Adding Webpack

添加webpack脚手架和webpack类型声明

npm install webpack webpack-cli --save-dev
npm install @type/webpack

在package.json添加

"build": "webpack"

在根目录下添加webpackconfig.ts

Step3: Adding Typeconfig

在根目录下添加tsconfig.ts,详细的配置可以前往(官方)[www.typescriptlang.org/tsconfig#is…]

{
  "compilerOptions": {
   "noEmit": false,
   "jsx": "react"
  }
}

Add an import, export, or an empty 'export {}' statement to make it a module.

"compilerOptions": {
  isolatedModules: false
}

Step4: Adding Babel

babel-loader 是用来解析语法的 @babel/preset-env是用来根据指定的执行环境提供语法装换.l

npm i @babel/core @babel/preset-env babel-loader --save-dev

在根目录下添加.babelrc,添加如下配置

{
    "presets": [
        "@babel/preset-env"
    ]
}

Step5: WebackConfig

输入输出

entry: 用于定义项目入口文件,Webpack 会从这些入口文件找出所有项目文件;

output: 用于定义输出的文件路径和文件名

module.exports = {
 mode: 'development',
    entry: "./src/index.tsx",
    output: {
        filename: "main.js",
        path: path.resolve(__dirname, "build"),
    },
}

模块处理

Resolve:配置模块路径解析规则

module: 用于配置模块加载规则

externals:排除那些事不需要webpack进行打包的,简称外部资源

Loader: 对于不同文件格式进行加载

Plugin: 扩展webpack的功能

html-webpack-plugin: 提供一个html页面,需指定文件夹。

npm install html-webpack-plugin --save-dev
module.exports = {
    mode: 'development',
    plugins: [
        new HtmlWebpackPlugin({
            template: path.join(__dirname, "public", "index.html"),
        }),
    ],
    module: {
        rules: [
            {
                test: /.tsx?$/,
                use: 'ts-loader', 
                include: [path.resolve(__dirname, '/src')], //指定文件
                exclude: /node_modules/,//排除
            }
        ]
     }
}

Step6: Adding Webpack dev server

webpack-dev-server用于提供http服务。

npm install --save-dev webpack-dev-server
{
  ...
  devServer: {
      static: {
          directory: path.join(__dirname, "build"),
      },
      port: 3000,
  },
}

仓库

参考: jsramblings.com/creating-a-…