TSConfig文件详解11

编译器配置项-compilerOptions

模块相关(二)

基础目录 - baseUrl

设置一个基础目录,基于该目录去解析模块名称。例如在以下目录结构中:

project
├── ex.ts
├── hello
│   └── world.ts
└── tsconfig.json

配置"baseUrl": "./",TypeScript 将查找与 tsconfig.json 位于同一文件夹中的文件。

import { helloWorld } from "hello/world";
console.log(helloWorld);

这个解析方案比从node_modules中查找具有更高的优先级。

这个功能设计目的是与浏览器中的 AMD 模块加载器结合使用,不建议在其他情况下使用。从 TypeScript 4.1 开始,使用paths配置后不再需要设置baseUrl

自定义引用-customConditions

customConditions配置一个引用列表,当TypeScript解析的模块的package.jsonexports / imports字段包含自定义引用列表中的条件时,应当解析成功。这些条件将添加到解析器默认使用条件列表中。

例如,当此字段在 tsconfig.json 中设置如下:

{
  "compilerOptions": {
    "target": "es2022",
    "moduleResolution": "bundler",
    "customConditions": ["my-condition"]
  }
}

每当在 package.json 中引用exportsimports字段时,TypeScript将优先使用my-condition指向的文件。

因此,当导入的包具有以下 package.json 时:

{
  // ...
  "exports": {
    ".": {
      "my-condition": "./foo.mjs",
      "node": "./bar.mjs",
      "import": "./baz.mjs",
      "require": "./biz.mjs"
    }
  }
}

TypeScript 将尝试查找与foo.mjs 对应的文件。

该字段仅在moduleResolution的值为node16nodenextbundler时有效。

模块-module

默认值:如果target为ES3/ES5是,为commonjs,其它情况为es6/es2015

设置程序的模块系统。有关更多信息,请参阅 TypeScript 模块选项背后的理论
及其参考页。在现代的nodejs工程中你可能设置为nodenext

更改module会影响moduleResolution,它也有一个参考页面

以下是index.tsmodule为不同值时的一些输出示例:

// @filename: index.ts
import { valueOfPi } from "./constants";
 
export const twoPi = valueOfPi * 2;

CommonJS

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.twoPi = void 0;
const constants_1 = require("./constants");
exports.twoPi = constants_1.valueOfPi * 2;

UMD

(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(require, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define(["require", "exports", "./constants"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    exports.twoPi = void 0;
    const constants_1 = require("./constants");
    exports.twoPi = constants_1.valueOfPi * 2;
});

AMD

define(["require", "exports", "./constants"], function (require, exports, constants_1) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    exports.twoPi = void 0;
    exports.twoPi = constants_1.valueOfPi * 2;
});

System

System.register(["./constants"], function (exports_1, context_1) {
    "use strict";
    var constants_1, twoPi;
    var __moduleName = context_1 && context_1.id;
    return {
        setters: [
            function (constants_1_1) {
                constants_1 = constants_1_1;
            }
        ],
        execute: function () {
            exports_1("twoPi", twoPi = constants_1.valueOfPi * 2);
        }
    };
});

ESNext

import { valueOfPi } from "./constants";
export const twoPi = valueOfPi * 2;

ES2015/ES6/ES2020/ES2022

import { valueOfPi } from "./constants";
export const twoPi = valueOfPi * 2;

除了 ES2015/ES6 的基本功能外,ES2020 还添加了对动态导入和 import.meta 的支持,而 ES2022 进一步添加了对顶级的await的支持。

node16/nodenext (nightly builds)

从 4.7+ 开始,node16nodenex则集成了nodejs本地ECMAScript 模块的支持。至于是输出CommonJS还是ES2020类型的JavaScript,由文件的扩展名和最近的package.jsontype设置的值决定。模块解析的工作方式也不同。您可以在手册k
模块参考.
中了解更多信息。

preserve

preserve这个值是在TypeScript 5.4中新增的,输入文件中的imports /exports语句将在输入中保留,CommonJs风格的import x = require("...")export = ...语句将输出为CommonJS的 requiremodule.exports。换句话说,每个文件的import/export都会被保留,而不是被强制编译为单一格式。

import { valueOfPi } from "./constants";
const constants = require("./constants");
export const piSquared = valueOfPi * constants.valueOfPi;

虽然很少需要在一个文件中混合使用importrequire语句,但这种module模式最好地反映了现代大多数的打包器,就下昂Bun 运行时的功能。

为什么要关心使用捆绑器或 Bun 发出的 TypeScript 模块,您可能还设置了 noEmit?TypeScript设置的module的类型影响类型检查和模块解析。设置module可以为TypeScript提供一些打包器或二者运行时如何处理import / exports的信息,这确保导入的类型准确反映运行时或打包后的情况。

None

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.twoPi = void 0;
const constants_1 = require("./constants");
exports.twoPi = constants_1.valueOfPi * 2;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容