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

这样基本就大功告成了。

相关推荐
soso19683 分钟前
JavaScript性能调优实战案例
javascript
Dxy12393102161 小时前
CSS常用样式详解:从基础到进阶的全面指南
前端·css
IT_陈寒1 小时前
SpringBoot自动配置揭秘:5个让开发效率翻倍的隐藏技巧
前端·人工智能·后端
Moment1 小时前
前端工程化 + AI 赋能,从需求到运维一条龙怎么搭 ❓❓❓
前端·javascript·面试
Joker Zxc1 小时前
【前端基础(Javascript部分)】6、用JavaScript的递归函数和for循环,计算斐波那契数列的第 n 项值
开发语言·前端·javascript
Highcharts.js1 小时前
React 图表如何实现下钻(Drilldown)效果
开发语言·前端·javascript·react.js·前端框架·数据可视化·highcharts
橙露2 小时前
Webpack/Vite 打包优化:打包体积减半、速度翻倍
前端·webpack·node.js
chushiyunen2 小时前
python中的魔术方法(双下划线)
前端·javascript·python
楠木6852 小时前
从零实现一个 Vite 自动路由插件
前端
终端鹿2 小时前
Vue2 迁移 Vue3 避坑指南
前端·javascript·vue.js