You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建支持直接导入子模块的npm包?无需/dist路径访问

实现npm包子模块直接导入的方案

问题描述

我想要创建一个npm包,使其支持直接导入子模块,例如使用const logger = require('server-package-poc/logger')的方式,和lodash、crypto-js的子模块导入逻辑一致。

当前包的入口文件代码如下:

// server-package-poc/index.ts
import greeter from "./greeter";
import logger from "./logger";

export { greeter, logger };

请问如何无需添加/dist路径就能访问logger、greeter等子模块?


解决方案

要实现这个功能,核心是利用npm的exports字段配置子路径映射,同时配合TypeScript的类型配置(如果用TS开发),具体步骤如下:

1. 配置package.json的exports字段

在package.json中添加exports字段,明确指定根模块和各个子模块的实际文件路径。即使编译后的文件放在dist目录,用户导入时也不需要写/dist:

{
  "name": "server-package-poc",
  "main": "./dist/index.js",
  "exports": {
    ".": "./dist/index.js",
    "./logger": "./dist/logger.js",
    "./greeter": "./dist/greeter.js"
  },
  // 保留其他原有字段(如scripts、dependencies等)
}

这里的路径要对应你编译后的文件位置,比如用TypeScript编译后输出到dist目录,就指向dist下的对应文件。

2. 确保子模块正确导出

每个子模块文件需要单独导出内容,比如:

// logger.ts
export default function logger(msg: string) {
  console.log(`[LOG] ${msg}`);
}
// greeter.ts
export default function greeter(name: string) {
  return `Hello, ${name}!`;
}

3. TypeScript配置优化(若使用TS)

如果你的包用TypeScript开发,需要调整tsconfig.json保证类型文件正确生成和识别:

  • 开启declaration: true,自动生成.d.ts类型文件
  • 指定outDir: "./dist",将编译后的js和d.ts文件统一输出到dist目录
  • 在package.json中添加类型映射,让TypeScript识别子模块类型:
{
  "types": "./dist/index.d.ts",
  "typesVersions": {
    "*": {
      "logger": ["./dist/logger.d.ts"],
      "greeter": ["./dist/greeter.d.ts"]
    }
  }
}

4. 测试导入

配置完成后,用户就能直接通过以下方式导入子模块:

  • CommonJS方式:
const logger = require('server-package-poc/logger');
const greeter = require('server-package-poc/greeter');
  • ES模块方式:
import logger from 'server-package-poc/logger';
import greeter from 'server-package-poc/greeter';

内容的提问来源于stack exchange,提问作者Qazi Amaan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:25:26