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

如何用ng-packagr在子入口间共享代码且排除共享代码分发

解决Angular库共享代码不对外暴露的问题

方法一:将shared设为内部次级入口,禁止外部访问

如果已经用次级入口存放shared代码,可通过以下方式阻止用户访问:

  1. 修改根package.json的导出配置:只对外暴露a和b两个次级入口,不包含shared。示例:
    {
      "name": "your-library",
      "exports": {
        "./a": "./dist/a",
        "./b": "./dist/b"
      },
      ...
    }
    
    这样用户尝试import 'your-library/shared'时会报错,因为根package.json未导出该路径。
  2. 标记shared为私有:在shared次级入口目录的package.json中添加"private": true,避免npm将其识别为可发布的独立模块:
    {
      "name": "your-library/shared",
      "private": true,
      ...
    }
    

方法二:不使用次级入口,直接在库内部共享代码

要避免创建shared次级入口,同时解决rootDir报错,可调整TypeScript配置:
假设你的库结构如下:

projects/your-lib/
├── src/
│   ├── lib/
│   │   ├── a/       # 次级入口a
│   │   ├── b/       # 次级入口b
│   │   └── shared/  # 共享代码目录
│   └── public-api.ts
└── tsconfig.lib.json

步骤1:调整根tsconfig.lib.json

确保rootDir指向库的源码根目录,并包含shared代码:

{
  "compilerOptions": {
    "rootDir": "./src",
    ...
  },
  "include": [
    "src/lib/**/*.ts"
  ],
  "exclude": [
    "src/test.ts",
    "src/**/*.spec.ts"
  ]
}

步骤2:配置次级入口的tsconfig

在a和b的次级入口配置文件(如tsconfig.lib.a.json、tsconfig.lib.b.json)中,扩展根配置并包含shared代码:
以tsconfig.lib.a.json为例:

{
  "extends": "../tsconfig.lib.json",
  "compilerOptions": {
    "outDir": "../../dist/a",
    "rootDir": "./src/lib"
  },
  "include": [
    "../lib/a/**/*.ts",
    "../lib/shared/**/*.ts"
  ]
}

步骤3:可选:使用路径别名简化导入

在根tsconfig.lib.json中添加路径别名,让a和b可以更简洁地导入共享代码:

{
  "compilerOptions": {
    "paths": {
      "@your-lib/shared": ["./src/lib/shared"]
    },
    ...
  }
}

之后在a或b中直接使用import { X } from '@your-lib/shared'即可。

这样配置后,shared代码会被打包进a和b的dist产物中,不会单独生成shared目录,自然无法被用户直接访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 07:00:17