:目录职责、生成机制与 import 使用指南)
区块链Web3【免费下载链接】ethers.jsComplete Ethereum library and wallet implementation in JavaScript.项目地址https://gitcode.com/gh_mirrors/et/ethers.js点击查看免费下载本篇指南围绕 ethers.js 仓库中 misc/basedirs/lib.esm/README.md 展开系统讲解lib.esm/目录在 ESMES Module项目中的角色、它如何通过npm run build与tsconfig.esm.json生成以及作为构建产物只读目录在使用与维护上应遵循的规则。读完本文你将掌握ESM 与 CommonJS 两种构建产物在 ethers.js 中如何共存、package.json的exports双入口如何路由到lib.esm、浏览器环境下的模块替换机制以及如何在自己的 ESM 项目中正确importethers。lib.esm 是什么为 ESM 项目准备的构建产物目录在 ethers.js 仓库中lib.esm/目录存放的是使用 ES Module 语法import/export编写的编译产物专门服务于采用 ESM 模块体系的 JavaScript/TypeScript 项目。与它并行的还有一个 lib.commonjs/ 目录存放使用require的 CommonJS 版本两者内容同源只是模块格式不同。对照两个目录各自的 READMElib.esm/README.md 与 lib.commonjs/README.md可以看到结构高度一致都明确写着The contents of this folder are for usingimport或requirein ESM或 CommonJSprojects。从目录实际内容看lib.esm/与lib.commonjs/保持着镜像式的模块布局均包含abi/、address/、constants/、contract/、crypto/、hash/、providers/、transaction/、utils/、wallet/、wordlists/等子模块目录每个模块下同时产出.js、.js.mapsource map、.d.ts、.d.ts.map文件。这种一一对应的结构保证了无论消费者使用哪种模块体系都能以相同的路径结构访问到同一套 API。与 CommonJS 版本的差异维度lib.esmESMlib.commonjsCommonJS模块语法import/exportrequire/module.exports适用项目ESM 项目type: module、.mjs、现代打包器CommonJS 项目require生成命令npm run buildnpm run build-commonjs编译配置tsconfig.esm.jsontsconfig.commonjs.json声明文件随 ESM 产物生成.d.ts与 source map随 CommonJS 产物生成.d.ts与 source map值得注意的是lib.esm/package.json 中声明了type: module这会让 Node.js 将目录内的.js文件一律按 ESM 解析而lib.commonjs目录则保持默认的 CommonJS 语义。这是双格式共存时让 Node.js 正确区分模块类型的关键配置。生成机制npm run build 与 tsconfig.esm.jsonlib.esm/不是手写维护的源码而是由构建工具自动生成的产物。这一点在 misc/basedirs/lib.esm/README.md 中讲得很清楚目录内容通过npm run build目标生成底层调用的是tscTypeScript 编译器与/tsconfig.esm.json配置不要手动修改该目录中的任何文件因为它们在build-clean时会被整体删除并重新生成。构建命令与脚本链路查看 package.json 中的 scripts 可以还原完整的构建链路{ scripts: { build: tsc --project tsconfig.esm.json, build-commonjs: tsc --project tsconfig.commonjs.json, build-all: npm run build npm run build-commonjs, build-clean: npm run clean npm run build node lib.esm/_admin/update-version.js node lib.esm/_admin/update-changelog.js npm run build-all npm run _build-dist npm run _dist-stats, clean: rm -rf dist lib.esm lib.commonjs cp -r misc/basedirs/* . } }其中关键点是npm run build等价于tsc --project tsconfig.esm.json产出lib.esm/npm run build-commonjs等价于tsc --project tsconfig.commonjs.json产出lib.commonjs/npm run build-clean是全量重建先执行clean删除dist、lib.esm、lib.commonjs三个目录并从misc/basedirs/复制基础文件回来——这正是两个 README 模板的来源再依次执行 ESM 构建、版本号更新、CHANGELOG 更新、CommonJS 构建、dist 打包与体积统计auto-buildnpm run build -- -w开启 TypeScript 的 watch 模式适合开发期间自动增量编译。tsconfig.esm.json 的编译配置tsconfig.esm.json 本身非常精简通过extends继承公共基础配置{ extends: ./tsconfig.base.json, compilerOptions: { module: es2020, outDir: ./lib.esm } }它只覆盖了两个关键项module: es2020指定输出 ES2020 模块语法即标准的import/export这是 ESM 产物与 CommonJS 产物tsconfig.commonjs.json 中为module: commonjs的根本区别outDir: ./lib.esm指定输出目录。其余编译选项统一继承自 tsconfig.base.json包括target: es2022、strict: true、declaration: true生成.d.ts、declarationMap: true、sourceMap: true生成.js.map、rootDir: ./src.ts源码根目录为src.ts/、importHelpers: true复用 tslib 减少重复代码等。也就是说lib.esm中的每个.js文件都对应src.ts/下的一个 TypeScript 源文件.d.ts与.js.map则分别服务于类型提示和调试时的源码映射。产物目录的只读属性README 中特别强调了两条维护规则不要修改lib.esm/内的文件——它们是编译输出任何手改都会在下一次build或build-clean时被覆盖如需修改lib.esm/README.md本身应修改其模板源 misc/basedirs/lib.esm/README.mdREADME 中原文指向/output/post-build/lib.esm结合clean脚本中的cp -r misc/basedirs/* .可知misc/basedirs/就是这些模板文件的实际存放位置该目录在build-clean时会被重新复制回lib.esm/。正确的做法是改动一律落在src.ts/源码或misc/basedirs/模板中然后重新构建。双入口路由package.json 如何把 ESM 消费者指向 lib.esmlib.esm/之所以能在发布后直接供 ESM 项目使用依靠的是根 package.json 中的exports字段——它是 Node.js 与现代打包器如 Rollup、webpack、Vite解析包内模块入口的依据。{ main: ./lib.commonjs/index.js, module: ./lib.esm/index.js, exports: { .: { import: ./lib.esm/index.js, default: ./lib.commonjs/index.js }, ./abi: { import: ./lib.esm/abi/index.js, default: ./lib.commonjs/abi/index.js }, ./address: { import: ./lib.esm/address/index.js, default: ./lib.commonjs/address/index.js }, ./wallet: { import: ./lib.esm/wallet/index.js, default: ./lib.commonjs/wallet/index.js } } }解析逻辑如下ESM 消费者使用import或 Node.js 检测到type: module命中import条件加载./lib.esm/index.jsCommonJS 消费者使用require命中default条件加载./lib.commonjs/index.js细粒度子路径导入exports为ethers/wallet、ethers/providers、ethers/utils等子模块分别声明了 ESM 与 CommonJS 双入口便于按需引入。官方文档 docs.wrm/getting-started.wrm 中的示例正是这种用法import { HDNodeWallet } from ethers/wallet;main与module字段则作为旧工具链的兼容回退main指向 CommonJS 版本module指向 ESM 版本供不支持exports的打包器使用。值得注意的是package.json 还声明了sideEffects: false配合 ESM 产物使用打包器可安全地对lib.esm中的模块进行 tree-shaking按需摇树优化只保留实际用到的导出。浏览器环境适配lib.esm 内的平台替换lib.esm/不仅服务于 Node.js 的 ESM 项目也服务于浏览器端的 ESM 打包场景。根 package.json 与 lib.esm/package.json 中都配置了browser字段把依赖 Node.js 内置能力或 Node 专有 API的实现替换为浏览器版{ browser: { ./lib.esm/crypto/crypto.js: ./lib.esm/crypto/crypto-browser.js, ./lib.esm/providers/provider-ipcsocket.js: ./lib.esm/providers/provider-ipcsocket-browser.js, ./lib.esm/providers/ws.js: ./lib.esm/providers/ws-browser.js, ./lib.esm/utils/base64.js: ./lib.esm/utils/base64-browser.js, ./lib.esm/utils/geturl.js: ./lib.esm/utils/geturl-browser.js, ./lib.esm/wordlists/wordlists.js: ./lib.esm/wordlists/wordlists-browser.js } }这六组映射覆盖了典型的 Node-only 模块加密原语crypto.js→crypto-browser.js使用 Web Crypto / 浏览器安全随机源IPC Socket 提供者provider-ipcsocket.js→provider-ipcsocket-browser.js浏览器中不存在本地 IPC 通道WebSocket 实现ws.js→ws-browser.js替换 Node 的ws包为浏览器原生 WebSocketBase64 编解码base64.js→base64-browser.js使用atob/btoaHTTP 请求geturl.js→geturl-browser.js使用fetch/XMLHttpRequest词库加载wordlists.js→wordlists-browser.js。根package.json中的映射键带./lib.esm/前缀与子包内自带的映射互为补充共同保证打包器在浏览器目标下替换掉这些模块。这解释了为何一个仓库能同时支撑 Node 服务端与浏览器端的 ESM 应用。在 ESM 项目中实际使用 lib.esm理解了生成机制与路由规则后在真实的 ESM 项目中消费 ethers 就非常直接。安装与导入方式如下示例源自 docs.wrm/getting-started.wrm# 安装 ethers npm install ethers// 方式一整体导入所有 API 挂载在 ethers 对象上 import { ethers } from ethers; // 方式二按需导入少量对象 import { BrowserProvider, parseUnits } from ethers; // 方式三从细粒度子路径导入对应 package.json 的 exports 子入口 import { HDNodeWallet } from ethers/wallet;在浏览器中也可以直接用script typemodule从 CDN 引入 ESM 构建script typemodule import { ethers } from https://cdnjs.cloudflare.com/ajax/libs/ethers/6.7.0/ethers.min.js; // Your code here... /script当你的项目满足以下任一条件时Node.js 或打包器就会命中lib.esm分支项目package.json声明了type: module使用.mjs扩展名使用 Rollup、Vite、webpack 等以 ESM 为目标的现代打包器并通过import条件解析。lib.esm中各子模块的入口文件如 lib.esm/wallet/index.js、lib.esm/providers/index.js会进一步导出该模块的完整 API 集合而 lib.esm/ethers.js 汇总了全部公共导出从 ABI 编解码、地址处理、合约、密码学到 Provider/Signer、交易、钱包与词库lib.esm/index.js 则同时提供ethers命名空间对象与平铺导出两种形式。版本信息由 lib.esm/_version.js 导出当前为6.17.0该文件同样由构建流程中的update-version.js自动维护不应手改。小结lib.esm/是 ethers.js 为 ESM 项目生成的只读构建产物与lib.commonjs/一一对应共用同一套 TypeScript 源码src.ts/它由npm run build即tsc --project tsconfig.esm.json生成tsconfig.esm.json通过module: es2020与outDir: ./lib.esm决定输出格式与位置根 package.json 的exports字段将import消费者路由到lib.esm/index.js将require消费者路由到lib.commonjs/index.js并提供ethers/wallet等子路径细粒度入口browser字段在浏览器打包场景下把 Node 专属实现替换为浏览器版crypto、ws、base64、geturl、ipcsocket、wordlists维护规则不要手改lib.esm/内文件如需调整 README 模板应改 misc/basedirs/lib.esm/README.md所有功能改动落在src.ts/后重新构建。对源码级细节感兴趣的读者可以继续深入 src.ts/index.ts、src.ts/ethers.tsESM 产物的编译输入以及 lib.commonjs/README.md对照理解 CommonJS 一侧的生成规则。赞分享区块链Web3【免费下载链接】ethers.jsComplete Ethereum library and wallet implementation in JavaScript.项目地址https://gitcode.com/gh_mirrors/et/ethers.js点击查看免费下载相关推荐三步掌握noteDigger零基础玩转智能音乐扒谱三步掌握noteDigger零基础玩转智能音乐扒谱 noteDigger是一款创新的纯前端音乐扒谱工具通过智能频谱分析技术帮助音乐创作者和爱好者轻松将音频区块链Web3Automatisch 集成App开发指南深入解析应用目录结构与各模块职责Automatisch 集成App开发指南深入解析应用目录结构与各模块职责 导读 本文以 Automatisch 官方文档《Folder Structur工作流自动化后端前端低代码任务调度深入解析 ASP.NET Coreaspnetcore 仓库构建产物 Artifacts 目录结构与使用指南深入解析 ASP.NET Coreaspnetcore 仓库构建产物 Artifacts 目录结构与使用指南 导读 从源码构建 aspnetcore htt后端Web框架上一篇cli-anything-iterm2 技术指南通过 CLI 无头驱动 iTerm2 会话、tmux 集成与偏好设置下一篇CefFlashBrowser让Flash内容重获新生的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考