在 package.json 中配置入口文件,只需添加或修改 main 字段并指向具体的模块文件路径即可。通常该值设为 ./dist/index.js 或 ./lib/index.js,表示构建后的主文件位置。当其他项目通过 require() 或 import 引用你的包时,node.js 和打包工具会优先加载这个指定的文件。

如何指定 CommonJS 和 ES Module 双入口
为了同时兼容使用 require() 的旧项目和支持 import 的新项目,可以在 package.json 中分别配置 main 和 module 字段。main 字段依然指向 CommonJS 格式的构建产物(如 dist/cjs/index.js),而新增的 module 字段则指向 ES Module 格式的产物(如 dist/esm/index.js)。这种双入口策略能让现代打包工具(如 Webpack、Vite)自动选择更优的模块格式进行 tree-shaking,从而减小最终包的体积。

{
"name": "my-package",
"version": "1.0.0",
"main": "./dist/cjs/index.js",
"module": "./dist/esm/index.js",
"scripts": {
"build": "npm run build:cjs && npm run build:esm"
}
}
上述配置展示了标准的现代 JavaScript 库结构。构建脚本需要分别生成 CJS 和 ESM 两种格式的文件。当消费者引入该包时,如果使用的是支持 module 字段的 bundler,它会读取 ./dist/esm/index.js;如果是 Node.js 环境直接运行,则会回退到 ./dist/cjs/index.js。这种机制确保了广泛的兼容性。
立即学习“Java免费学习笔记(深入)”;
如何处理 TypeScript 源码的直接引用
如果希望开发者在不经过构建步骤的情况下直接使用 TypeScript 源码,或者提供类型定义文件的路径,可以配置 types 或 typings 字段。虽然 main 决定了代码执行入口,但 types 字段告诉 TypeScript 编译器去哪里查找类型声明(通常是 .d.ts 文件)。在实际项目中,这通常与 exports 字段结合使用,以提供更精细的条件导出控制,确保类型检查和代码加载的一致性。

{
"name": "my-package",
"version": "1.0.0",
"main": "./dist/cjs/index.js",
"module": "./dist/esm/index.js",
"types": "./dist/types/index.d.ts",
"exports": {
".": {
"import": "./dist/esm/index.js",
"require": "./dist/cjs/index.js",
"types": "./dist/types/index.d.ts"
}
}
}
这段代码展示了使用 exports 字段进行条件导出的完整示例。它明确指定了在不同环境下(import 或 require)应该加载哪个 JS 文件,以及对应的类型声明文件位置。这种方式比单独使用 main、module 和 types 更加严谨,能够防止路径错误导致的运行时异常或类型丢失问题。对于大多数现代 npm 包,推荐采用这种基于 exports 的配置方式。


















