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

这样基本就大功告成了。

相关推荐
weixin_382395234 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__4 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.5 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~6 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华6 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子9 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅9 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni9 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学10 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端