
Webpack 源码开发环境搭建指南从 Setup 脚本到测试、Lint 与示例构建全流程【免费下载链接】webpackA bundler for javascript and friends. Packs many modules into a few bundled assets. Code Splitting allows for loading parts of the application on demand. Through loaders, modules can be CommonJs, AMD, ES6 modules, CSS, Images, JSON, Coffeescript, LESS, ... and your custom stuff.项目地址: https://gitcode.com/GitHub_Trending/web/webpack本文基于 webpack 仓库根目录的 _SETUP.md 文档系统讲解如何从零搭建 webpack 的本地开发环境包括一键 setup 脚本的工作原理、手动安装与yarn link自链接机制、完整的测试/基准测试/格式化/Lint 命令以及如何构建examples/示例目录。读完本文你可以独立完成 webpack 源码级的二次开发与调试并理解每条 setup 命令在 setup/setup.js 和 package.json 中对应的真实实现。一键初始化yarn setup与npm run setupwebpack 仓库统一使用yarn执行命令。根据是否已安装yarn初始化入口有两条路径# 已安装 yarn 时 yarn setup # 未安装 yarn 时setup 过程会顺带为你安装 yarn npm run setup两者最终都指向 package.json 中的同一脚本setup: node ./setup/setup.js也就是说yarn setup与npm run setup的区别仅在于谁来执行这个脚本实际逻辑完全由 setup/setup.js 承担。setup 脚本的执行流程setup/setup.js的核心流程是检测自链接 → 确保 yarn 存在 → 执行安装与链接其幂等设计使重复执行不会报错检测自链接setup/setup.js 的checkSymlinkExistsAsync检查node_modules/webpack是否存在且为符号链接。若已满足整个 setup 直接以成功退出。确保 yarn 可用ensureYarnInstalledAsync执行yarn -v并用 semver 正则校验版本号输出若不可用则自动执行npm install -g yarn。执行安装与链接setup/setup.js 的runSetupSymlinkAsync依次运行三条命令yarn install # Install dependencies yarn link # Create webpack symlink yarn link webpack # Link webpack into itself结果校验链接完成后再次检查node_modules/webpack是否为符号链接若失败会抛出windows symlink was not successfully created错误——从源码结构看这条错误信息表明该流程特别针对 Windows 下符号链接创建可能失败的场景做了兜底校验。为什么需要 link webpack into itselfwebpack 仓库在开发过程中lib/里的代码会require自身的webpack依赖例如测试、示例构建。yarn link webpack在node_modules/webpack处创建了指向仓库根目录的符号链接使本地开发始终使用你正在修改的源码而不是 npm 上发布的版本。这也是 setup 脚本把自链接是否存在作为完成判据的原因。手动搭建流程如果不走自动化脚本_SETUP.md给出的手动步骤如下git clone https://github.com/webpack/webpack.git cd webpack npm install -g yarn yarn yarn link yarn link webpack逐行说明命令作用git clone ...克隆仓库到本地npm install -g yarn全局安装 yarn当前仓库 package.json 中声明packageManager为yarn1.22.22即经典版 Yarn 1.xyarn等价于yarn install安装dependencies与devDependencies含 jest、eslint、prettier、typescript 等开发工具链yarn link将当前包注册为全局可链接包yarn link webpack在本地node_modules下建立指向本仓库的webpack自链接环境前提package.json 声明engines: { node: 10.13.0 }。需要注意的是测试与基准测试脚本使用了--experimental-vm-modules、--expose-gc、--hash-seed等较新的 Node 启动参数见下文test:base与benchmark脚本因此实际跑完整测试套件建议使用较新的 Node.js LTS 版本。运行测试套件完整测试yarn testyarn test从 package.json 的脚本定义看yarn test会在执行前触发pretest钩子先跑一遍完整 Lint然后再执行test:basepretest: yarn lint, test: yarn test:base, test:base: node --expose-gc --max-old-space-size4096 --experimental-vm-modules --trace-deprecation node_modules/jest-cli/bin/jest --workerIdleMemoryLimit512MB --logHeapUsagetest:base的关键参数含义--expose-gc --max-old-space-size4096暴露全局 GC 并限制堆内存 4GB供测试中主动回收内存--experimental-vm-modulesJest 运行 ESM 模块用例所需--workerIdleMemoryLimit512MB --logHeapUsage空闲 Jest worker 超过 512MB 即回收并打印堆用量。只跑集成测试yarn test:integration # watch 模式修改文件后自动重跑 yarn test:integration --watch对应脚本通过 Jest 的--testMatch圈定范围test:integration: yarn test:base --testMatch \rootDir/test/*.{basictest,longtest,test}.js\即只运行 test/ 目录下*.basictest.js、*.longtest.js、*.test.js三类文件如ConfigTestCases.basictest.js、TestCasesProduction.longtest.js、Compiler.test.js。只跑单元测试yarn test:unit # watch 模式 yarn test:unit --watch对应test:unit: yarn test:base --testMatch \rootDir/test/*.unittest.js\只运行*.unittest.js如ChunkGraph.unittest.js、ModuleGraph.unittest.js。更新 Jest 快照yarn test:update-snapshots即yarn test:base -u以 update 模式重跑测试并刷新快照文件快照存放于 test/__snapshots__/ 及各用例目录下的.snap文件。Jest 的全局行为由 jest.config.js 定义testTimeout为 30000ms、自定义testEnvironmenttest/harness/patch-node-env.js与snapshotResolvertest/harness/snapshot/resolver.js并默认匹配.test.js / .basictest.js / .longtest.js / .unittest.js / .spectest.js五类文件。关于各测试目录cases/、configCases/、hotCases/、statsCases/、benchmarkCases/等的职责划分仓库内有专门的 TESTING_DOCS.md 文档可配合本文命令查阅。运行基准测试yarn benchmarkpackage.json 中该脚本以一组保证可复现性的 Node 启动参数运行 test/BenchmarkTestCases.benchmark.mjsnode --max-old-space-size6144 --experimental-vm-modules --trace-deprecation \ --hash-seed1 --random-seed1 --no-opt --predictable --predictable-gc-schedule \ --interpreted-frames-native-stack --allow-natives-syntax --expose-gc \ --no-concurrent-sweeping ./test/BenchmarkTestCases.benchmark.mjs其中--hash-seed1 --random-seed1固定了哈希与随机数种子--no-opt --predictable关闭 JIT 与不可预测的 GC 调度目的是让多次运行之间具备可比性。基准用例位于 test/benchmarkCases/按目录名区分build、*-unit、*-runtime三种形态分类细节见 TESTING_DOCS.md 中 benchmarkCases 一节。格式化与 Lint代码格式化Prettieryarn fmt对应fmt: yarn fmt:base --log-level warn --write底层调用node node_modules/prettier/bin/prettier.cjs --cache --ignore-unknown .带缓存地对全仓库执行 Prettier 写入。完整 Lintyarn lint_SETUP.md将完整 Lint 归为四类检查eslintlint:code脚本dependencieslockfile 检查即原文档所称lint:yarn类检查typeslint:types脚本schema format generated fileslint:special脚本当前仓库 package.json 中lint脚本的实际执行链比原文档列出的四类更完整lint: yarn lint:code yarn lint:special yarn lint:types yarn lint:types-test yarn lint:types-benchmark yarn lint:types-module-test yarn lint:types-hot yarn fmt:check lint:spellcheck各子项对应的实现子脚本命令说明lint:codeeslint --cache .基于 eslint.config.mjs 的全仓 ESLint 检查lint:speciallockfile-lint、schemas-lint、inherit-types、format-schemas、tooling/generate-runtime-code.js、generate-wasm-code.js、generate-css-data.js、generate-html-data.js、generate-html-entities.js、compile-to-definitions、precompile-schemas、generate-types、generate-internal-serializables.js校验 lockfile 与 schema并验证运行时/WASM/CSS/HTML 等生成文件是否与源码一致lint:typestsc基于根 tsconfig.jsonstrict: true、checkJs: true、noEmit: true对lib/、bin/、setup/、tooling/、示例配置等做类型检查lint:types-test等tsc -p tsconfig.types.test.json等对hot/、测试、benchmark、module.test 等配套 tsconfig 分别做类型检查fmt:checkprettier--check只检查不写入保证格式合规lint:spellcheckcspell ... **/*.*全仓拼写检查词表见 cspell.json值得注意的联动关系prelint被定义为yarn setup也就是说任何先于lint执行的场景都会先确保本地环境依赖与自链接是就绪的。单独运行类型检查yarn lint:types # 增量watch 模式 yarn lint:types --watch--watch下 TypeScript 以增量方式重跑适合长时间开发会话中开着类型检查实时反馈。构建 examples 示例examples/目录包含上百个演示用例code-splitting、asset、wasm、module-federation 等。每个示例目录内都有webpack.config.js、build.js和template.md其中template.md内嵌了当前版本实际构建输出使示例文档与真实产物保持同步。重建全部示例yarn build:examples对应build:examples: cd examples node buildAll.js。examples/buildAll.js 的工作方式通过 examples/examples.js 的findInFolder递归扫描examples/下含template.md的目录深度为 2对每个目录顺序执行cd 示例目录 node build.js并打印[i/N]进度其中persistent-caching示例会被额外多跑一次验证持久缓存的二次构建行为只要有任一示例失败脚本最终抛出${failed} examples failed错误。重建单个示例cd examples/path to example node build.js例如cd examples/code-splitting node build.js。从源码结构看各示例的build.js依赖共享的 examples/build-common.js 与 examples/template-common.js前者负责用该示例的webpack.config.js真实执行一次编译后者负责把产物内容整理并写回示例的模板文件。因此修改lib/中影响输出的实现后跑一遍yarn build:examples可以直观核对各示例输出是否变化。小结日常开发命令速查目的命令一键初始化自动装 yarn、装依赖、建自链接yarn setup/npm run setup完整测试先 Lint 后 Jestyarn test集成测试 / watchyarn test:integration [--watch]单元测试 / watchyarn test:unit [--watch]刷新快照yarn test:update-snapshots基准测试yarn benchmarkPrettier 格式化yarn fmt全量 Lintyarn lint类型检查 / watchyarn lint:types [--watch]重建全部示例 / 单个示例yarn build:examples/cd examples/dir node build.js以上命令均源自 package.json 的scripts定义与 setup/setup.js 的实现在当前仓库webpack 5.110.3中可直接使用。【免费下载链接】webpackA bundler for javascript and friends. Packs many modules into a few bundled assets. Code Splitting allows for loading parts of the application on demand. Through loaders, modules can be CommonJs, AMD, ES6 modules, CSS, Images, JSON, Coffeescript, LESS, ... and your custom stuff.项目地址: https://gitcode.com/GitHub_Trending/web/webpack创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考