node 运行ts 脚本的那些些事儿

我们知道 nodejs 默认使用是 commonjs 模块导入导出方式

js 复制代码
// 创建并导出模块
exports.foo = function() {
    console.log('foo');
};

// 导入模块
var lib = require('./foo');
lib.foo(); // 调用

如果我们要使用 esm 模块导入方式

  1. 直接将文件后缀 .js 改成 .mjs (方式1)
  2. 在package.json 新增type字段 { type: 'module' } (方式2)

nodejs 使用 ts-node 执行 .ts 文件

如果我们使用ts-node运行 .ts 文件 , 可能会报 Unknown file extension ".ts" for xxx.ts

ts 复制代码
// package.json
{
  type: "module"
}


// foo.ts
export function foo(x: number): number {
  return x * 2;
}

// test.ts
import { foo } from "./foo";

console.log(foo(1));


// 命令终端执行 
npx ts-node ./test.ts //Unknown file extension ".ts" for xxx.ts

因为我们代码中使用的是esm 导入导出, 所以package.json 设置了 type: "module",这是很正常的事情,但原因在于ts-node 执行的时候, 先编译commonjs 模块的.js 文件, 然后用node 执行.js 文件, import 导入对 ts-node 来说没有实际功能作用, 只是一个标记符号。 所以这里设置的type:"module" 反而不对了, 要么删除type要么设置type:"commonjs"

js 复制代码
// package.json
{
  type: "commonjs"
}


// foo.ts
export function foo(x: number): number {
  return x * 2;
}

// test.ts
import { foo } from "./foo";

console.log(foo(1));


// 命令终端执行 
npx ts-node ./test.ts // Cannot use import statement outside a module

当我们把package.json 改成 type: "commonjs" 后又报 Cannot use import statement outside a module, 这是因为ts-node 编译.ts 文件的时候会走 tsconfig.json 文件, 这个文件中有个编译选项 module: "ESNext"

ts 复制代码
{
    "compilerOptions": {
        "module": "ESNext",
    },
    "include": ["src/"],
}

这就导致了 ts-node 编译成的 js 文件是 esm 模块化标准。但 ts-node 里面的 node 执行时依旧是以 commonjs 标准执行的

所以这里也要干掉 module: "ESNext" 或者改成module: "commonjs"

很多时候我们项目在用 tsconfig.json 文件, 但是我们要执行node ts脚本的时候配置项 module 会和 tsconfig.json 冲突了, 这个时候我们可以用ts-node 执行的ts 脚本的时候 手动指定一个自定义个 tsconfig.json 文件

bash 复制代码
npx ts-node --project ./tsconfig.custom.json ./test.ts

这样基本就大功告成了。

相关推荐
AlienZHOU7 小时前
AI Coding 时代下,我的技术面试实践分享
前端·后端·面试
Captaincc10 小时前
AI用量v0.1.11更新发布 新增 jusage doctor 诊断指令 托盘展示token 和余额 新增 AutoClaw 支持
前端·后端·vibecoding
计算机魔术师11 小时前
德国Wiki被黑后两周,OpenAI终于把模型失控的账本摊开了
前端
kyriewen12 小时前
我让 AI 当面试官面了我一轮:第 3 个追问我就卡住了(附 10 道追问清单)
前端·面试·ai编程
IT_陈寒12 小时前
Python的GIL把我坑惨了,多线程跑得比单线程还慢
前端·人工智能·后端
前端snow12 小时前
ai agent --- 多agent框架之图编排引擎-langgraph
前端
竹林81812 小时前
OmniPic Studio v3.2.1 核心技术架构与全平台发版解析文档
前端·浏览器
JamesZhang8007812 小时前
页面内存只涨不跌? 一次泄漏排查, 牵出 WeakMap 的诞生
前端
Z小明12 小时前
第 6 章 组件进阶
前端·vue.js
江华森13 小时前
HTTP请求的完整过程详解:从DNS解析到TCP挥手的微秒级实战分析
前端