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

这样基本就大功告成了。

相关推荐
code_YuJun2 分钟前
脚手架开发工具——dotenv
前端
San30.8 分钟前
深度驱动:React Hooks 核心之 `useState` 与 `useEffect` 实战详解
前端·javascript·react.js
Mr_Swilder18 分钟前
vscode没有js提示:配置jsconfig配置
前端
skywalk816320 分钟前
使用Trae 自动编程:为小学生学汉语项目增加不同出版社教材的区分
服务器·前端·人工智能·trae
huohuopro28 分钟前
LangChain | LangGraph V1教程 #3 从路由器到ReAct架构
前端·react.js·langchain
柒.梧.44 分钟前
HTML入门指南:30分钟掌握网页基础
前端·javascript·html
用户54277848515401 小时前
Promise :从基础原理到高级实践
前端
用户4099322502121 小时前
Vue3条件渲染中v-if系列指令如何合理使用与规避错误?
前端·ai编程·trae
Mr_Swilder1 小时前
2025-12-20 vue3中 eslint9+和prettier配置
前端
code_YuJun1 小时前
脚手架开发工具——判断文件是否存在 path-exists
前端