使用webpack5从0到1搭建React+TypeScript 项目环境

本文详细介绍了如何使用Webpack5从头开始搭建React和TypeScript项目的开发与生产环境配置,涉及package.json、webpack配置文件、Babel和TypeScript配置等内容。
摘要由CSDN通过智能技术生成

记录一下自己使用 webpack5从0到1搭建React+TypeScript 项目环境 

创建项目目录

1. 生成package.json文件
 $ npm init -y // -y 表示使用默认值
2. 创建项目目录

由于很多配置在「开发环境」和「生产环境」下是不一致的,所以在这里我分成了‘开发环境’和‘生产环境’ 让打包更加灵活

  • webpack.config.dev.js   // 开发环境下的配置
  • webpack.config.prod.js  // 生产环境下的配置
  • webpack.config.common.js  // 开发和生产都需要的配置
  • webpack.config.js   // 对不同环境下的配置进行整合
webpack.config.common.js
const { resolve } = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
  // webpack配置
  // 入口文件
  entry: './src/index.tsx',
  output: {
    // 输出的文件名
    filename: 'script/[name].[contenthash].js',
    // 输出路径
    path: resolve(__dirname, '../dist'),
    // 每次打包前 清空dist目录
    clean: true
  },

  // loader 配置
  module: {
    rules: []
  },
  // 解析器
  resolve: {
    extensions: [".ts", ".tsx", ".js", ".jsx"],
  },

  // 插件配置
  plugins: [
    new HtmlWebpackPlugin({
      // 复制一个html文件 并将打包好的js文件引入
      template: './index.html',
      // 压缩 HTML
       minify: {
         collapseWhitespace: true, // 压缩空格
         removeComments: true // 删除注释
       }
    })
  ]
}
webpack.config.dev.js
const Package = require('../package.json')

// ?? 非空运算符 当第一个参数为undefined或者null时,返回第二个参数,否则返回第一个参数。
const proxy = Package.proxy ?? {}

module.exports = {
  module: {
    rules: []
  },
  devtool: 'eval-cheap-module-source-map',
  mode: 'development', // 开发模式
  devServer: {
    static: '../dist', // 将dist目录作为web服务器的根目录
    compress: true, // 启用gzip压缩
    port: 3000, // 设置开发服务器的端口号
    hot: true, // 启用热更新
    proxy, // 代理
    // 解决SPA(单页应用)在路由跳转之后,进行页面刷新时,返回404的错误。
    historyApiFallback: true 
  }
}
webpack.config.prod.js
module.exports = {
  output: {
    filename: 'script/[name].[contenthash].js'
  },
  module: {
    rules: []
  },
  plugins: [],
  mode: 'production' // 设置mode为production
}
webpack.config.js
// merge 用来合并webpack配置
const { merge } = require('webpack-merge')
const commontConfig = require('./webpack.config.common.js')
const developmentConfig = require('./webpack.config.dev.js')
const productionConfig = require('./webpack.config.prod.js')

module.exports = (env) => {
  switch (true) {
    case env.development:
      return merge(commontConfig, developmentConfig)

    case env.production:
      return merge(commontConfig, productionConfig)

    default:
      // 或者抛出错误
      return new Error('No matching configuration was found')
  }

} 

​
index.html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta
    name="viewport"
    content="width=device-width, initial-scale=1.0"
  >
  <title>Document</title>
</head>

<body>
  <div id="root"></div>
</body>

</html>
配置启动打包命令
// package.json

"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
   + "start": "webpack serve -c  ./config/webpack.config.js --env development",
   + "build": "webpack ./config/webpack.config.js --env production"
  },
配置React + TypeScript环境
$ npm install react react-dom
$ npm install @types/react @types/react-dom -D

or

$ yarn add react react-dom
$ yarn add @types/react @types/react-dom -D

index.tsx 文件

import React from 'react';
import ReactDOM from 'react-dom/client'

const App = () => {
  return (
    <div>
      <h1>Hello, world!</h1>
    </div>
  )
}

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
)

添加 babel 配置

babel官网 传送🚪  https://www.babeljs.cn/


npm install babel-loader @babel/core @babel/preset-env @babel/preset-react @babel/preset-typescript @babel/plugin-transform-runtime @babel/runtime typescript -D

or

yarn add babel-loader @babel/core @babel/preset-env @babel/preset-react @babel/preset-typescript @babel/plugin-transform-runtime @babel/runtime typescript -D

创建babel配置文件

babel.config.json

{
  "presets": [
    "@babel/preset-env",
    "@babel/preset-react",
    "@babel/preset-typescript"
  ],
  "plugins": [
    [
      "@babel/plugin-transform-typescript",
      {
        // Babel将使用regenerator-runtime来转换ts的声明文件,使其可以在旧版本的js环境中运行                      
        "regenerator": true
      }
    ]
  ]
}

需要在 webpack.config.common.js 添加规则

// webpack.config.common.js
module: {
    rules: [
      {
        test: /\.(ts|js)x?$/,
        exclude: /node_modules/,
        use: {
          loader: 'babel-loader',
          options: {
            presets: [
              "@babel/preset-env",
              "@babel/preset-react",
              "@babel/preset-typescript",
            ]
          }
        }
      },
    ]
  },

配置 tsconfig.json

// 生成 ts配置文件

$ npx tsc --init

tsconfig.json 文件  删除多余配置项和注释

{
  "compilerOptions": {
    "target": "es2016",                                
    "jsx": "preserve",                                /* Specify what JSX code is generated. */
    "module": "commonjs",                                /* Specify what module code is generated. */
    "rootDir": "./src/",                                  /* Specify the root folder within your source files. */
    "sourceMap": true,                                /* Create source map files for emitted JavaScript files. */
    "outDir": "./dist/",                                   /* Specify an output folder for all emitted files. */
    "removeComments": true,                           /* Disable emitting comments. */
    "esModuleInterop": true,                            
    "forceConsistentCasingInFileNames": true,            /* Ensure that casing is correct in imports. */
    "strict": true,                                      /* Enable all strict type-checking options. */
    "skipLibCheck": true                                 /* Skip type checking all .d.ts files. */
  }
}

启动 !!!

$ npm install webpack webpack-cli webpack-dev-server -D

or

$ yarn add webpack webpack-cli webpack-dev-server -D

在 index.tsx 添加

import React from 'react';
import ReactDOM from 'react-dom/client'

const App = () => {
  return (
    <div>
      <h1>Hello, world!</h1>
    </div>
  )
}

ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
)

最后 使用 · npm start · 或者 · yarn start · 直接启动

然后我们在浏览器中访问 http://localhost:3000

最后 狠狠拿下

当然 这里还有很多其他模块没有配置 例如 css、less 什么的 那个都简单 后面慢慢配. 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 Electron React 项目实例: 1. 创建一个新的项目文件夹并进入该文件夹: ``` mkdir electron-react-app cd electron-react-app ``` 2. 初始化 npm 项目: ``` npm init -y ``` 3. 安装必要的依赖项: ``` npm install --save electron react react-dom npm install --save-dev electron-builder babel-cli babel-preset-env babel-preset-react webpack webpack-cli webpack-dev-server html-webpack-plugin ``` 4. 创建一个 webpack 配置文件 webpack.config.js: ``` const path = require('path'); const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/index.js', output: { path: path.join(__dirname, '/dist'), filename: 'index_bundle.js' }, module: { rules: [ { test: /\.js$/, exclude: /node_modules/, use: { loader: 'babel-loader', options: { presets: ['env', 'react'] } } } ] }, plugins: [ new HtmlWebpackPlugin({ template: './src/index.html' }) ] }; ``` 5. 创建一个 .babelrc 配置文件: ``` { "presets": ["env", "react"] } ``` 6. 创建一个入口文件 src/index.js: ``` import React from 'react'; import ReactDOM from 'react-dom'; ReactDOM.render(<h1>Hello, Electron and React!</h1>, document.getElementById('root')); ``` 7. 创建一个 HTML 文件 src/index.html: ``` <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Electron React App</title> </head> <body> <div id="root"></div> <script src="index_bundle.js"></script> </body> </html> ``` 8. 创建一个 main.js 文件作为 Electron 主进程文件: ``` const { app, BrowserWindow } = require('electron'); const path = require('path'); const url = require('url'); let mainWindow; function createWindow() { mainWindow = new BrowserWindow({ width: 800, height: 600 }); mainWindow.loadURL(url.format({ pathname: path.join(__dirname, 'dist', 'index.html'), protocol: 'file:', slashes: true })); mainWindow.on('closed', function () { mainWindow = null }); } app.on('ready', createWindow); app.on('window-all-closed', function () { if (process.platform !== 'darwin') { app.quit() } }); app.on('activate', function () { if (mainWindow === null) { createWindow() } }); ``` 9. 在 package.json 中添加以下脚本: ``` "scripts": { "start": "webpack-dev-server --mode development", "build": "webpack --mode production && electron-builder", "electron": "electron ." } ``` 10. 启动项目: ``` npm start ``` 这将启动 Webpack Dev Server 并在浏览器中打开应用程序。在开发期间,每当更改 React 代码时,Webpack Dev Server 会自动重新编译代码并重新加载应用程序。 11. 打包应用程序: ``` npm run build ``` 这将使用 Webpack 和 electron-builder 打包应用程序。打包后的应用程序将在 dist 目录中生成。 12. 运行应用程序: ``` npm run electron ``` 这将启动 Electron 并加载打包后的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值