tsconfig.json的esModuleInterop使用场景是怎样的?

鸿蒙APP调试.zip 华为 鸿蒙系统 开发 立即下载
  • 问题场景
  • npm包改造前,仅支持esm
  • npm包改造后,既支持esm,又支持cjs
  • 为什么改造后,还是会报错?
  • 如何理解ts编译配置esModuleInterop?
  • 总结

问题场景

遇到一个很有趣的场景,cjs中需要引入原先打包方式为esm方式的模块。

也就是想要通过require(),去引入一个export的模块。

my-npm-package包的暴露方式为:


import foo from "./foo";
import bar from './bar';
export { foo, bar };

支持的方式为

import {foo, bar} from 'my-npm-package';

cjs中想要使用esm方式的包

const { foo } = require("my-npm-package");

会报错:SyntaxError: Cannot use import statement outside a module

那么如何使得原先仅支持esm方式的包,改造为既支持esm又支持cjs呢?
打包方式commonjs。
这只支持了cjs,esm怎么支持呢?
支持esm是通过引入包的项目的babel进行转化进行支持的。

npm包改造前,仅支持esm

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2015",
    "module": "esnext",
  }
}

打包结果:

import foo from "./foo";
import bar from './bar';
export { foo, bar };
//# sourceMappingURL=index.js.map

npm包改造后,既支持esm,又支持cjs

tsconfig.json

{
  "compilerOptions": {
    "target": "ES2015",
    "module": "commonjs"
  }
}

打包结果:

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.bar = exports.foo = void 0;
const foo_1 = require("./foo");
exports.foo = foo_1.default;
const bar_1 = require("./bar");
exports.bar = bar_1.default;
//# sourceMappingURL=index.js.map

cjs: exports.xxx
esm: Object.defineProperty(exports, “__esModule”, { value: true });

可以“csj引入原先方式为esm包”的原因是什么?
exports.xxx
原先esm方式的包,还可以正常使用的原因是什么?
Object.defineProperty(exports, "__esModule", { value: true });

那就是“__esModule”,webpack会根据__esModule,将模块识别为esm,最后通过babel转化为cjs模块方式引入。

回到我们的场景:改造esm模块为既支持cjs,又支持esm,能实现的原因是什么?

第一步:target从esm改为commonjs,从而支持cjs
第二步:这一步其实不用做,主项目的babel已经做了配置,对于所有esm和cjs的包,都可以通过esm方式引入。

为什么改造后,还是会报错?

先说结论:因为tsc cjs方式打包,默认会把import a from ‘a’, a.method()的包,转化为const a_1 = require(‘a’), a_1.default.method()。而有些npm包,没有exports.default。
如何解决:开启esModuleInterop。

TypeError: Cannot read properties of undefined (reading ‘stringify’)

这是因为,在我们的npm包中,有使用到query-string这个依赖。

import queryString from 'query-string';
const query_string_1 = require("query-string");
query_string_1.default.stringify(body) // 这里发生了报错

经过tsc打包后,会转换为为query_string_1.default。

但是query-string@7.1.1的index.js,并没有暴露default。

转换后

const query_string_1 = exports;
// query-string@7.1.1
exports.parseUrl
exports.stringifyUrl 
exports.pick
exports.exclude
exports.stringify
exports.extract
exports.parse

那么如何解决这个问题呢?开启tsconfig.json中的esModuleInterop为true。
从而将exports作为default返回。

{
  "compilerOptions": {
    "target": "ES2015",
    "module": "commonjs",
    "esModuleInterop": true
  }
}

打包结果:

// index.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.bar = exports.foo = void 0;
const foo_1 = __importDefault(require("./foo"));
exports.foo = foo_1.default;
const bar_1 = __importDefault(require("./bar"));
exports.bar = bar_1.default;
//# sourceMappingURL=index.js.map

不仅仅是index.js会注入__importDefault ,所有经过tsc编译的ts文件,都会注入__importDefault。

// foo.js
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
const query_string_1 = __importDefault(require("query-string"));

经过__importDefault 转换后,变为

const query_string_1 = __importDefault( exports );

转换后

const query_string_1 = { default: exports };
query_string_1.default.stringify(body) // 这里就没问题了。

如何理解ts编译配置esModuleInterop?

除了默认引入缺少default的情况,按照namespace方式引入的情况,也需要配置esModuleInterop去兼容。

先来看看ts官方文档:https://www.typescriptlang.org/tsconfig#esModuleInterop

默认情况下,esModuleInterop关闭,ts按照CommonJS/AMD/UMD模块处理为es6模块一样去处理。有两种情况下不能这样去处理:

  • ❌ import * as moment from “moment” 当做const moment = require(“moment”)
  • ❌import moment from "moment"当做const moment = require(“moment”).default

开启后可以避免这2个问题:

import * as fs from "fs";
import _ from "lodash";
fs.readFileSync("file.txt", "utf8");
_.chunk(["a", "b", "c", "d"], 2);

禁用时(直接require):

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const fs = require("fs");
const lodash_1 = require("lodash");
fs.readFileSync("file.txt", "utf8");
lodash_1.default.chunk(["a", "b", "c", "d"], 2);

开启时(辅助导入函数__importStar, __importDefault):

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = __importStar(require("fs"));
const lodash_1 = __importDefault(require("lodash"));
fs.readFileSync("file.txt", "utf8");
lodash_1.default.chunk(["a", "b", "c", "d"], 2);

再来看一下知乎上一位前端同学的文章:https://zhuanlan.zhihu.com/p/148081795

esm引入cjs可以interop(互操作)的核心思想是:esm有default,而cjs没有,为cjs模块增加default。

引用一段作者的话,很精简:

目前很多常用的包是基于 cjs / UMD 开发的,而写前端代码一般是写 esm,所以常见的场景是 esm 导入 cjs 的库。但是由于 esm 和 cjs 存在概念上的差异,最大的差异点在于 esm 有 default 的概念而 cjs 没有,所以在 default 上会出问题。TS babel webpack 都有自己的一套处理机制来处理这个兼容问题,核心思想基本都是通过 default 属性的增添和读取

总结

1.如何将esm模块打包为cjs?

module改为commonjs。

2.为什么esm可以通过import引用cjs的包?

babel会把import转为require。

3.如何理解esModuleInterop?

兼容只有umd,cjs方式且没有暴露deault属性的包,添加default属性,从而使得import a from "a"或者import * as a from "a"引入的包,不会报没有default属性。例如query-string@7.1.1这样的包。
保险起见,建议开启这个配置。

4.为什么module为esnext时不会报错?

因为module为esnext时,代码直接就是esModule模式,也就是import, default模式,不会被转为cjs并带一个尾缀default的方式。

可以说,怎么写的,打包出来就是原模原样的。

import webcVCS from "./webcVCS";
import generateAssets from './generateAssets';
export { webcVCS, generateAssets, };
import queryString from 'query-string';
5.以后打包,module怎么配置?
  • esnext: 只在esm环境使用的包
  • commonjs:纯cjs或既在cjs又在esm环境使用的包(esm环境使用一般是由安装包的项目,结合webpack,babel等打包工具支持的)
  • umd: 同commonjs,且需要同时支持cjs,amd, cmd
ES6新特性之模块Module用法详解 主要介绍了ES6新特性之模块Module用法,简要说明了模块Module的概念、功能并结合实例形式分析了模块Module的使用方法与相关注意事项,需要的朋友可以参考下 立即下载

相关推荐

【Qualcomm高通音频】如何封装音频控件?

音频代码涉及面很广,这篇文档介绍如何封装音频控件给HAL层使用。这里以AW87519芯片调试为例进行介绍封装音频控件和使用的方法。在最初接出到高通音频基础功能调试的时候,都是从tinyalsa指令/mixer_paths文件配置开始。因为单独一个音频设备的调试,都对应一条音频链路的打通。比如以下链接上高通平台基础音频输入输出设备调试: 【Qualcomm音频】Speaker 调试记录http...

crow_ch的博客 1955

typescript的tsconfig中esModuleInterop的到底做了什么?

问题引入 很多 react 使用者在从 JS 迁移到 TS 时,可能会遇到这样一个问题: JS 引入 react 是这样的: // js import React from 'react' 而 TS 却是这样的: // ts import * as React from 'react' 如果直接在 TS 里改成 JS 一样的写法,在安装了 @types/react 的情况下,编辑器会抛出一个错误:此模块是使用 "export =" 声明的,在使用 "esModuleInterop" 标志

过客2019 5425

工作笔记05:imu、底盘车轮、单激光雷达外参校准(基于hdl_graph_slam建图和定位)

目录1. imu 校准1.1 IMU型号1.2 坐标定义1.2.1 大地坐标系(WGS84)1.2.2 当地地理坐标系(ENU)1.2.3 传感器坐标轴定义1.3 传感器校准2. 底盘车辆参数配置3. 单激光雷达校准参考文献 1. imu 校准 1.1 IMU型号 阅读IMU产品说明书,获得如下信息: Yesense YIS300 系列惯性传感系统 YIS300 系列包含: YIS300-U 惯性测量单元(IMU):输出经过校准的加速度和角速度值,同时也能够输出磁场强度信息。 YIS300-V 垂直参考系

穿林需独行的博客 4203

esModuleInterop 是如何影响 tsc 的

本文尝试从 CommonJS 和 ES Module 两者规范的差异,详细说明该配置是如何影响 tsc 编译结果的。背景:从一个意外的问题说起tsconfig有个配置项esModuleInterop: boolean,它会影响 typescript 在编译时如何处理模块加载。该配置修改后(false -> true) 导致图片上传代码报错,报错部分代码摘要如下:import * as TPS...

淘系技术 1076

2024年全国大学生电子设计竞赛A题_AC-AC变换电路并联运行

AC-AC变换电路并联运行(A 题)【本科组】

qq_74395263的博客 7836

训练救星!EMA多尺度注意力让YOLOv11轻松攻克自定义数据集不涨点难题

在目标检测模型训练中,自定义数据集不涨点是阻碍算法落地的核心痛点之一。传统训练策略在数据分布特殊、样本量有限的场景下极易陷入收敛停滞,而 EMA(指数移动平均)结合多尺度注意力的方案,在自定义数据集上实现mAP 提升 6.5%,同时让训练曲线从“平缓停滞”转为“持续攀升”,彻底解决创新点在自有数据上的性能瓶颈。本教程将带你从原理到实践,通过 EMA 多尺度注意力为 YOLOv11 注入训练稳定性,让你的自定义数据集模型训练实现质的飞跃。EMA 衰减率:小样本数据集建议将decay。

FJN110的博客 160

tsconfig之esModuleInterop属性

选项的作用是支持使用的方式引入commonjs包。

wfly blog 1411

【AUTOSAR-DEM】-2.4-APP SWC如何读取MIL灯状态以及配置MIL灯

该篇博文将告诉您: MIL(Malfunction Indicator Lamp/Light)灯的点灯和灭灯过程; DEM模块如何配置MIL灯; APP SWC如何获取MIL灯状态。

「汽车电子助手」的博客 1712

typescript编译选项esModuleInterop的作用

esModuleInterop选项的作用是支持使用import d from 'cjs'的方式引入commonjs包。 引入commonjs模块的方式 无类型声明文件 如果一个模块没有类型声明,可以直接使用const cjs = require('cjs')的方式引入模块,此时cjs的类型是any 有类型声明文件 1.使用import cjs = require('cjs')方法引入 2.使用...

神以灵的博客 1万+

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

【OS】AUTOSAR OS系统调用产生Trap的过程详解

AUTOSAR OS系统调用产生Trap的过程详解

qq_36056498的博客 2438

tsconfig配置文件增加“esModuleInterop“: true,有什么作用?

是 TypeScript 中提升模块互操作性的关键配置,它让你可以:用 ESM 的自然导入 CommonJS 模块;避免手动处理与的转换;写出更简洁、符合现代 JS 风格的代码。惠州西湖。

jongden的专栏 779

自然语言处理之机器翻译:Transformer:Transformer在低资源语言翻译中的应用

Transformer模型是自然语言处理领域的一个重要突破,由Vaswani等人在2017年的论文《Attention is All You Need》中提出。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN)的序列依赖性,采用自注意力机制(Self-Attention)处理输入序列,极大地提高了训练效率和模型性能。

zhubeibei168的博客 1014

别再瞎配了!手把手教你用tsconfig.json搞定TypeScript项目(附常用配置清单)

本文深入解析TypeScript项目中tsconfig.json的核心配置,提供Vue、React和Node.js等不同场景的优化方案。从基础配置到高级技巧,手把手教你解决模块解析、类型扩展等常见问题,助力开发者提升工程化水平。

weixin_30878501的博客 406

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

别再死记硬背了!用这10个高频tsconfig.json配置项搞定你的TypeScript项目

本文详细解析了10个高频tsconfig.json配置项,帮助开发者高效配置TypeScript项目。从基础结构到模块系统、输出配置与严格类型检查,提供实战指南和推荐模板,助你摆脱死记硬背,快速掌握TypeScript配置精髓。

weixin_30407613的博客 305

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

TypeScript 配置文件 tsconfig.json 常用配置项详解

本文详细解析了 TypeScript 配置文件 tsconfig.json 的核心配置项。主要内容包括:compilerOptions 中的关键参数(如 target、module、lib 等)用于控制编译目标与模块系统;include/exclude 管理文件编译范围;sourceMap、esModuleInterop 等实用功能配置。通过合理设置这些选项,开发者能优化编译流程,提升代码质量与调试效率,使 TypeScript 项目更好地适应不同开发需求。文章为 TypeScript 项目配置提供了实用指

你若盛开,清风自来 546

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

NIW国家利益豁免申请指南:Claude Immigration Attorney如何用AI完成Dhanasar三要素论证

Claude Immigration Attorney 是一套基于 Claude Code 的 AI 移民请愿技能包,帮助移民律师和自请申请人起草 EB-2 NIW 国家利益豁免、O-1A 与 EB-1A 请愿信,核心原则是**每一句话都有证据支撑**。本指南面向新手,讲解如何用这套 AI 工具系统性地完成 NIW 申请中最关键的 **Dhanasar 三要素论证**,并产出一份可供律师审核的完整

gitblog_01073的博客 327

配置 tsconfig.json:高级选项

本文深入解析了 TypeScript 项目中 tsconfig.json 文件的核心配置,重点探讨了 compilerOptions 中的高级选项设置。文章从 tsconfig.json 的基本结构入手,详细介绍了 strict 模式、target 和 module 等关键配置项的作用与优化策略。通过实际示例展示了如何通过严格类型检查提升代码安全性,如何选择目标 JavaScript 版本实现兼容性平衡,以及如何配置模块系统适应不同环境需求。文章强调合理配置这些选项对项目质量、开发效率和代码可维护性的重要意

zimin的专栏 973

Pock Touch Bar 管理器完整设置指南:4 大模块把 Touch Bar 从入门用到顺手

Pock 是一款免费开源的 MacBook Touch Bar widgets 管理器,负责把你常用的一键操作搬到 Touch Bar 上:把 Dock 搬进 Touch Bar 切换窗口、快速调用应用与服务,同时把主屏幕空间完整留给工作。它适合所有带 Touch Bar 的 MacBook 用户——尤其是觉得 Touch Bar 常年吃灰、想用它提高切换效率的人。下文按「首次配置 → 外观与布局

gitblog_00597的博客 446

别再死记硬背了!用这10个高频配置项搞定你的第一个tsconfig.json

本文为TypeScript新手提供了10个高频tsconfig.json配置项的详细指南,帮助开发者快速搭建实用的开发环境。从编译目标(target)到模块系统(module),再到严格模式(strict)等核心配置,文章逐一解析其作用,并提供一个可直接复制使用的基础模板,大幅降低TypeScript入门门槛。

weixin_30915951的博客 361

WeChatFerry 完整指南:如何搭建一个可接入大模型的免费微信机器人

想让自己的微信账号自动回复消息,从哪里入手?开源项目 WeChatFerry 是一个选择:它基于微信 Hook 技术收发微信消息,可接入 DeepSeek、ChatGPT 等大模型,是一个开箱即用的微信机器人框架。 ## WeChatFerry 是什么 WeChatFerry 是一个基于微信客户端 Hook 技术的微信自动化框架,它把收发消息、查询联系人、管理群组等底层能力开放成可编程调用的接

gitblog_00706的博客 934

TypeScript学习-第11章:配置文件(tsconfig.json)

上一章咱们用模块把代码拆得明明白白,终于摆脱了“大杂烩”困境。可一执行编译命令 tsc 又懵了:编译后的JS文件跟TS源码混在一起,看得眼花缭乱;明明写的是ES6语法,编译后却变成了老旧的ES3;甚至有些测试文件、配置文件也被一并编译……这时候就需要 tsconfig.json 登场了!它就像TS编译的“专属控制面板”,能自定义编译目标、输出路径、文件范围等所有规则,让编译行为完全按你的想法来。今天咱们就手把手搞定这个“配置神器”,从此告别编译混乱的尴尬。

Amon的专栏 962

tsconfig.json的target和module详解

target决定语法降级程度,直接影响代码运行环境兼容性。module决定模块组织方式,直接影响模块加载、导出/导入语法及 Tree-shaking 效果。两者需匹配目标运行环境(浏览器/Node.js/库),并考虑工具链(Webpack/Babel/Vite)的支持情况。通过lib等配置可进一步细化编译行为。通过合理配置target和module,可平衡代码兼容性性能优化与开发体验,是 TypeScript 项目工程化的核心环节。

949

别再死记硬背了!用这5个真实项目场景,彻底搞懂tsconfig.json怎么配

本文通过Vite+Vue3、Node.js后端服务、React组件库、Monorepo工程和老项目迁移五个真实项目场景,深入解析如何精准配置tsconfig.json。从现代前端到后端服务,再到复杂工程架构,掌握TypeScript配置的核心逻辑,提升开发效率和代码质量。

weixin_30580341的博客 405

2025前端TypeScript配置指南:从0到1优化tsconfig.json

TypeScript已成为现代前端开发的必备工具,而tsconfig.json作为TypeScript项目的核心配置文件,直接影响代码质量、编译效率和项目可维护性。本文将带你从基础到进阶,系统掌握tsconfig.json的优化技巧,让你的TypeScript项目配置既专业又高效。 ## 为什么tsconfig.json如此重要? tsconfig.json是TypeScript编译器的配置中

gitblog_00434的博客 668

TypeScript配置完全指南:tsconfig.json深度解析

本文全面解析TypeScript核心配置文件tsconfig.json,详细介绍了其文件结构、编译选项分类及严格模式配置。文章重点讲解了模块解析、源码映射、声明文件生成等关键设置,并提供了Node.js、React和库项目的实际配置示例。同时分享了渐进式严格化、环境特定配置等最佳实践,以及编译性能优化等常见问题解决方案。掌握这些配置技巧能有效提升TypeScript项目的开发体验和代码质量。

大家好,我是张小白! 1052
上一篇: TypeScript类型体操姿势合集-easy题解
下一篇: 如何打一个既支持cjs,又支持esm的npm包?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

趁你还年轻233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值