首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >'package.json‘不在'rootDir’之下

'package.json‘不在'rootDir’之下
EN

Stack Overflow用户
提问于 2019-04-18 20:16:13
回答 7查看 34.3K关注 0票数 68

我试图在我的package.json应用程序中导入TypeScript:

代码语言:javascript
运行
复制
import packageJson from '../package.json';

我的tsconfig.json包含以下内容:

代码语言:javascript
运行
复制
{
  "compilerOptions": {
    "rootDir": "./src/"
    "outDir": "./dist/",
    "baseUrl": ".",
    "resolveJsonModule": true
  }
}

问题是,当我编译它时,我得到

error TS6059: File '/path/to/package.json' is not under 'rootDir' '/path/to/app/src/'. 'rootDir' is expected to contain all source files.

我不确定我是否理解这个问题,因为./src//.dist都有相同的父..,所以TypeScript可以把import '../package.json'放在一边--不管是rootDir还是outDir,它都能工作

总之,我尝试了以下几种方法,但结果并不令人满意:

  • 删除rootDir -编译作品,但是dist将包含dist/src,我不想要
  • 删除outDir -然后src受到.js文件的污染(如果sourceMap为真,则为.js.map )
  • 添加@ts-ignore -编译将停止导入../package.json的文件

如何解决这个限制,将生成的文件保存在dist中,并允许从rootDir的父目录导入

EN

回答 7

Stack Overflow用户

发布于 2020-04-27 20:01:30

这是可能的,事实证明,不是硬的

解决方案是而不是明显的,因为类型记录依赖于rootDir来决定输出的目录结构(请参阅这句话来自打字本的老板),并且只能导入输出或包依赖项中包含的代码。

  • 如果将rootDir设置为项目的根,则package.json将被发出到outDir的根,并可以导入。但是,编译后的src文件将被写入outDir/src
  • 如果将rootDir设置为src,则其中的文件将编译为outDir的根目录。但是现在package.json,所以它发出了“一个错误,因为项目似乎是错误的配置”(老板的话)。

解决方案:使用单独的类型记录子项目。

类型记录项目是由tsconfig文件定义的,它是自包含的,并且有效地受到其rootDir的限制。这是一件非常好的事情,因为它符合封装的原则。

您可以拥有多个项目(例如,main和一组库),每个项目都位于自己的目录中,并具有自己的tsconfig。它们之间的依赖关系使用类型记录项目参考资料在tsconfig文件中声明。

我承认,“项目”这个词很差,因为从直觉上讲,它指的是整个项目,但“模块”和“包”已经在这方面被采用了。把它们看作是“子项目”,这样就更有意义了。

我们将把src目录和包含package.json的根目录视为单独的项目。每个文件都有自己的tsconfig文件。

  1. src自己的项目。 ./src/tsconfig.json: { "compilerOptions":{ "rootDir":".“、"outDir":”./dist/“、"resolveJsonModule":true }、"references"://这是我们如何从{ "path":”./“}/此项目声明依赖项到根目录}的方法。
  2. 给根目录它自己的项目。 ./tsconfig.json: { "compilerOptions":{ "rootDir":".","outDir":".",//如果文件的输出路径与其src路径相同,则不会发出"resolveJsonModule":true、“复合”:true // required对依赖关系项目的引用工作}、“outDir”://通过白名单显示要包含的文件,TS不会自动"package.json“//包含根目录下的所有源,这是默认的。}
  3. 运行tsc --build src和voil! 这将构建src项目。因为它声明了对根项目的引用,所以它也会构建这个引用,但前提是它已经过时了。由于根tsconfig具有与outDir相同的dir,所以tsc将不对package.json (它配置为编译的一个文件)做任何事情。

这对独舞者来说是很棒的

  • 您可以通过将模块/库/子项目放在自己的子目录中并为它们提供自己的tsconfig来隔离它们。
  • 您可以使用项目参考资料显式地管理依赖关系,还可以模块化构建: 从链接的文档:
代码语言:javascript
运行
复制
- you can greatly improve build times

一个期待已久的特性是TypeScript项目的智能增量构建。在3.0中,您可以将--build标志与tsc一起使用。这实际上是tsc的一个新入口点,它的行为更像是一个构建编排器,而不是一个简单的编译器。

运行tsc --build (简称tsc -b)将执行以下操作:

代码语言:javascript
运行
复制
    - Find all referenced projects
    - Detect if they are up-to-date
    - Build out-of-date projects in the correct order

不要担心命令行中传递的文件的顺序-如果需要,tsc会重新排序它们,以便总是先构建依赖关系。

代码语言:javascript
运行
复制
- **enforce logical separation between components**
代码语言:javascript
运行
复制
- organize your code in new and better ways.

这也很简单:

  1. 一个用于共享选项的根tsconfig,并使用一个简单的tsc --build命令构建所有子项目(使用--force从头构建它们) src/tsconfig.json { "compilerOptions":{ "outDir":".",//阻止此tsconfig编译任何文件//我们希望子项目继承这些选项:“ES2019”:"ES2019",“模块”:"es2020",“es2020”:true,},//配置此项目以构建以下所有内容:“引用”:{“路径”:“./公共”}{“路径”:"./projectA“}}
  2. 由于没有项目引用而无法从其他子项目导入的“公共”库。 src/common/tsconfig.json { "compilerOptions":“./tsconfig.json”,//继承根tsconfig //,但重写以下内容:"rootDir":{“rootDir”:".","outDir":“././build/outDir”,"resolveJsonModule":true,“复合”:true }
  3. 由于声明的引用可以导入公共的子项目。src/projectA/tsconfig.json { "compilerOptions":“./tsconfig.json”,//继承根tsconfig //,但重写以下内容:"rootDir":{“rootDir”:".","outDir":“././build/libA”,"resolveJsonModule":true,“复合”:true },"references":{ "path":“./公用”}}
票数 90
EN

Stack Overflow用户

发布于 2020-04-25 13:23:02

我们可以将resolveJsonModule设置为false,并在typings.d.ts中为*.json声明一个模块,这将需要JSON文件作为模块,并且它将生成dist目录中没有任何目录结构的文件。

Monorepo目录结构

代码语言:javascript
运行
复制
monorepo\
├─ app\
│  ├─ src\
│  │  └─ index.ts
│  ├─ package.json
│  ├─ tsconfig.json
│  └─ typings.d.ts
└─ lib\
   └─ package.json

app/typings.d.ts

代码语言:javascript
运行
复制
declare module "*.json";

app/src/index.ts

代码语言:javascript
运行
复制
// Import from app/package.json
import appPackageJson from '../package.json';

// Import from lib/package.json
import libPackageJson from '../../lib/package.json';

export function run(): void {
  console.log(`App name "${appPackageJson.name}" with version ${appPackageJson.version}`);
  console.log(`Lib name "${libPackageJson.name}" with version ${libPackageJson.version}`);  
}

run();

app/package.json含量

代码语言:javascript
运行
复制
{
  "name": "my-app",
  "version": "0.0.1",
  ...
}

lib/package.json含量

代码语言:javascript
运行
复制
{
  "name": "my-lib",
  "version": "1.0.1",
  ...
}

现在,如果我们使用tsc编译这个项目,我们将得到以下dist目录结构:

代码语言:javascript
运行
复制
app\
└─ dist\
   ├─ index.d.ts
   └─ index.js

如果我们使用node ./dist运行它,我们将得到来自applib package.json信息的输出:

代码语言:javascript
运行
复制
$ node ./dist
App name "my-app" with version 0.0.1
Lib name "my-lib" with version 1.0.1

您可以在这里找到项目存储库:https://github.com/clytras/typescript-monorepo

票数 24
EN

Stack Overflow用户

发布于 2022-07-07 04:03:39

Node、16+、LTS和TypeScript 4.7+为使用ES模块而不是CommonJS的软件包提供了一个整洁的三步解决方案。

字段 in package.json定义了只能从实际包中导入的内部伪包。定义内部导入说明符,如#package.json in package.json

代码语言:javascript
运行
复制
{
  "type": "module",
  "exports": "./dist/index.js",
  "imports": {
    "#package.json": "./package.json"
  }
}

tsconfig.json中启用ES模块的TypeScript支持和JSON导入

代码语言:javascript
运行
复制
{
  "compilerOptions": {
    "module": "nodenext",
    // "moduleResolution" defaults to "nodenext", just made explicit here
    "moduleResolution": "nodenext",
    "resolveJsonModule": true,
  }
}

最后,来自您的#package.json模块的TypeScript:

代码语言:javascript
运行
复制
import packageJson from '#package.json' assert { type: 'json' };

console.log(packageJson);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55753163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档