news 2026/4/16 10:19:15

现代webpack/react/typescript/pnpm项目模板,从零到一搭建webpack项目

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
现代webpack/react/typescript/pnpm项目模板,从零到一搭建webpack项目

项目模板

模板地址
如果急用,直接使用当前模板即可。点击右上角Use This Template即可创建一个新的项目。

背景

当我每每创建一个新的webpack项目时,总是需要经过繁琐的webpack配置来完成项目的init。如果从网络上搜寻快速的setup总会遇到各种各样的问题(由于包的版本有更新,有些配置已经废弃掉了)所有我决定搭建自己的webpack配置模板。

搭建步骤

1. pnpm 开启webpack项目

1.1 生成package.json

pnpminit

1.2 引入webpack

pnpmadd-D webpack webpack-cli webpack-dev-server

1.3 引入typescript

pnpmadd-D typescript ts-node @types/node

1.4 引入react

pnpmaddreact react-dom
pnpmadd-D @types/react @types/react-dom

2. 初始化react代码

2.1 创建src/app.tsx

constApp=()=>{return<div>Hello World</div>}exportdefaultApp

2.2 创建src/index.tsx

import{createRoot}from'react-dom/client'importAppfrom'./app'createRoot(document.getElementById('root')!).render(<App/>)

3. webpack配置

3.1 创建webpack.config.ts

importpathfrom'path'import{fileURLToPath}from'url'importtype{Configuration}from'webpack'constrootDir=path.dirname(fileURLToPath(import.meta.url))constconfig:Configuration={entry:'./src/index.tsx',output:{path:path.resolve(rootDir,'dist'),filename:'[name].[contenthash].js'},resolve:{extensions:['.ts','.tsx','.js','.jsx']},devtool:'source-map',module:{},mode:'development'}exportdefaultconfig

3.2 设置webpack插件

pnpmadd-D html-webpack-plugin clean-webpack-plugin

在public下创建index.html

<!doctypehtml><htmllang="en"><head><metacharset="UTF-8"/><metaname="viewport"content="width=device-width, initial-scale=1.0"/><title>Webpack React Template</title></head><body><divid="root"></div></body></html>

webpack 补充插件配置以及devServer配置

importpathfrom'path'import{fileURLToPath}from'url'importHtmlWebpackPluginfrom'html-webpack-plugin'import{CleanWebpackPlugin}from'clean-webpack-plugin'importtype{Configuration}from'webpack'import'webpack-dev-server'constrootDir=path.dirname(fileURLToPath(import.meta.url))constconfig:Configuration={entry:'./src/index.tsx',output:{path:path.resolve(rootDir,'dist'),filename:'[name].[contenthash].js'},resolve:{extensions:['.ts','.tsx','.js','.jsx']},plugins:[newHtmlWebpackPlugin({template:'./public/index.html'}),newCleanWebpackPlugin()],devtool:'source-map',devServer:{static:{directory:path.join(rootDir,'public')},compress:true,historyApiFallback:true},mode:'development'}exportdefaultconfig

3.3 设置webpack loader(style)

pnpmadd-D style-loader css-loader sass sass-loader

引入到webpack config的rules中:

constconfig:Configuration={entry:'./src/index.tsx',output:{path:path.resolve(rootDir,'dist'),filename:'[name].[contenthash].js'},resolve:{extensions:['.ts','.tsx','.js','.jsx']},plugins:[newHtmlWebpackPlugin({template:'./public/index.html'}),newCleanWebpackPlugin()],devtool:'source-map',module:{rules:[{test:/\.css$/i,use:['style-loader','css-loader']},{test:/\.scss$/i,use:['style-loader','css-loader','sass-loader']},{test:/\.(png|jpg|jpeg|gif|svg)$/i,type:'asset/resource'}]},devServer:{static:{directory:path.join(rootDir,'public')},compress:true,historyApiFallback:true},mode:'development'}exportdefaultconfig

这里还引入静态资源的rules直接从asset/resource中获取。
因为我们引入了sass,这里我们还需要定义sass文件(.sass,.scss)的模块类型,在src/types里创建index.d.ts:

declaremodule'*.scss'{constcontent:{[className:string]:string}exportdefaultcontent}

3.4 设置webpack babel

pnpmadd-D @babel/core @babel/preset-env @babel/preset-react @babel/preset-typescript babel-loader

在config进行如下配置

importpathfrom'path'import{fileURLToPath}from'url'importHtmlWebpackPluginfrom'html-webpack-plugin'import{CleanWebpackPlugin}from'clean-webpack-plugin'importtype{Configuration}from'webpack'import'webpack-dev-server'constrootDir=path.dirname(fileURLToPath(import.meta.url))constconfig:Configuration={entry:'./src/index.tsx',output:{path:path.resolve(rootDir,'dist'),filename:'[name].[contenthash].js'},resolve:{extensions:['.ts','.tsx','.js','.jsx']},plugins:[newHtmlWebpackPlugin({template:'./public/index.html'}),newCleanWebpackPlugin()],devtool:'source-map',module:{rules:[{test:/\.(ts|js)x?$/,exclude:/node_modules/,use:[{loader:'babel-loader',options:{presets:['@babel/preset-env',['@babel/preset-react',{runtime:'automatic'}],'@babel/preset-typescript']}}]},{test:/\.css$/i,use:['style-loader','css-loader']},{test:/\.scss$/i,use:['style-loader','css-loader','sass-loader']},{test:/\.(png|jpg|jpeg|gif|svg)$/i,type:'asset/resource'}]},devServer:{static:{directory:path.join(rootDir,'public')},compress:true,historyApiFallback:true},mode:'development'}exportdefaultconfig

4. typescript配置

根目录上创建tsconfg.json

{"compilerOptions":{"module":"esnext","target":"esnext","moduleResolution":"bundler","lib":["dom","dom.iterable","esnext"],"sourceMap":true,"declaration":true,"declarationMap":true,"noUncheckedIndexedAccess":true,"exactOptionalPropertyTypes":true,"strict":true,"jsx":"react-jsx","jsxImportSource":"react","verbatimModuleSyntax":true,"isolatedModules":true,"noUncheckedSideEffectImports":true,"moduleDetection":"force","skipLibCheck":true}}

通过上述配置,我们修改package.json的scripts

"scripts":{"start":"webpack serve --open --port 3210","build":"webpack"}

此时运行pnpm run start即可在3210端口访问项目。

接下来的内容是锦上添花:优化工程,即代码风格格式化,typescript eslint规则校验,使用git hooks触发生命周期钩子

5. 使用prettier格式化代码

pnpmadd-D prettier

在根目录创建.prettierrc

{"semi":false,"singleQuote":true,"trailingComma":"none","tabWidth":4,"useTabs":false,"printWidth":120,"bracketSpacing":true,"arrowParens":"avoid","endOfLine":"auto"}

在package.json配置格式化脚本

"scripts":{"start":"webpack serve --open --port 3210","build":"webpack","format":"prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,md}\""},

执行即可把src中所有代码文件格式化

6. 配置eslint

pnpmadd-D eslint typescript-eslint eslint-plugin-react eslint-plugin-react-hooks eslint-webpack-plugin

根目录创建eslint.config.js

importtseslintfrom'typescript-eslint'importreactPluginfrom'eslint-plugin-react'importreactHooksfrom'eslint-plugin-react-hooks'exportdefault[...tseslint.configs.recommended,{files:['**/*.{ts,tsx}'],plugins:{react:reactPlugin,'react-hooks':reactHooks},rules:{...reactPlugin.configs.recommended.rules,...reactHooks.configs.recommended.rules},settings:{react:{version:'detect'}}}]

在packages的scripts脚本中写入

"scripts":{"start":"webpack serve --open --port 3210","build":"webpack","format":"prettier --write \"src/**/*.{js,jsx,ts,tsx,json,css,md}\"","lint":"eslint --ext .ts,.tsx","lint:fix":"eslint --ext .ts,.tsx --fix"},

7. husky 设置lint-staged

pnpmadd-D husky lint-staged

7.1 初始化git仓库

gitinit

7.2 初始化husky

  1. npx方式
npx husky init
  1. pnpm方式
pnpmexechusky init

7.3 配置husky的pre-commit钩子

在.husky中创建pre-commit(无后缀)文件
写入

npx lint-staged

并在package.json中的根object里写入lint-staged配置

"lint-staged":{"src/**/*.{ts,tsx}":["eslint --fix"]}

此时,每当你git commit的时候它都会先执行eslint

8. husky设置commit message

为了规范每次提交记录的message,我们使用commitlint规范:

feat: add new feature fix: bug fix docs: documentation changes style: formatting changes refactor: code refactoring test: adding tests chore: maintenance tasks

引入commit-lint

pnpmadd-D @commitlint/cli @commitlint/config-conventional

创建commitlint.config.js

exportdefault{extends:['@commitlint/config-conventional']}

在.husky目录中创建commit-msg(无后缀)文件并写入:

pnpmexeccommitlint --edit$1

此后后续的commit提交的message都会匹配是否以上述规范中的lint的title相匹配,比如我提交一个需求必须以:feat:开头

9. 创建.gitignore

屏蔽掉常见的本地配置/依赖项

# Dependencies node_modules .pnpm-store # Build output dist # IDE .idea .vscode *.swp *.swo # OS .DS_Store Thumbs.db # Logs *.log npm-debug.log* # Environment .env .env.local .env.*.local
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 10:17:53

为什么你的空间转录组数据无法聚类?,R语言降维关键参数深度剖析

第一章&#xff1a;为什么你的空间转录组数据无法聚类&#xff1f; 空间转录组技术能够同时捕获基因表达与组织空间位置信息&#xff0c;但在实际分析中&#xff0c;许多研究者发现数据难以有效聚类。这一问题通常源于数据预处理不当、空间噪声干扰或算法选择不合理。 数据质量…

作者头像 李华
网站建设 2026/4/11 4:28:34

深入浅出 Ascend C:昇腾 AI 芯片的原生编程语言详解

引言&#xff1a;为什么需要 Ascend C&#xff1f;随着人工智能技术的飞速发展&#xff0c;AI 芯片成为推动算力革命的关键引擎。华为昇腾&#xff08;Ascend&#xff09;系列 AI 处理器凭借其高能效比、强大的矩阵计算能力和软硬协同架构&#xff0c;在大模型训练与推理、边缘…

作者头像 李华
网站建设 2026/4/16 8:27:33

私有化Dify日志分析全指南(从采集到可视化,一站式解决方案)

第一章&#xff1a;私有化 Dify 日志分析概述在企业级 AI 应用部署中&#xff0c;Dify 作为一个支持可视化编排与模型管理的低代码平台&#xff0c;其私有化部署版本被广泛应用于数据安全要求较高的场景。日志系统作为可观测性的核心组成部分&#xff0c;承担着监控运行状态、排…

作者头像 李华
网站建设 2026/4/15 16:36:43

女性网安职场生存指南:从入门小白到安全领域领导力养成记

女性网络安全从业者生存指南&#xff1a;从入门到领导力 “计算机专业女生&#xff0c;校招投安全岗被问‘你能熬夜做应急响应吗&#xff1f;’”“做行政转行网安&#xff0c;身边全是男同事&#xff0c;开会插不上话”“技术能力达标&#xff0c;却因‘女性要顾家’被 pass 晋…

作者头像 李华
网站建设 2026/4/15 11:18:03

Dify与Spring AI异常处理全透视:5种必须掌握的错误响应模式

第一章&#xff1a;Dify与Spring AI异常处理的核心挑战 在集成 Dify 与 Spring AI 的过程中&#xff0c;异常处理成为系统稳定性的关键瓶颈。两者分别运行于异构架构之上&#xff1a;Dify 基于事件驱动的低代码 AI 工作流引擎&#xff0c;而 Spring AI 遵循传统 Java 的响应式编…

作者头像 李华
网站建设 2026/4/9 0:15:12

10分钟上手Cursor:AI编程助手从入门到精通

第一次听说Cursor时&#xff0c;我也怀疑过——又是一个AI编程噱头吗&#xff1f;但作为一名每天要与代码搏斗八小时的开发者&#xff0c;尝试三周后&#xff0c;我的工作流彻底改变了。这不是简单的代码补全工具&#xff0c;而是真正能理解你意图的编程伙伴。 安装与初识&…

作者头像 李华