当前位置: 首页 > ops >正文

放弃 tsc+nodemon 使用 tsx 构建Node 环境下 TypeScript + ESM 开发环境搭建指南

放弃 tsc+nodemon 使用 tsx 构建Node 环境下 TypeScript + ESM 开发环境搭建指南

目标

在 node 环境下构建 typescript + esmodule模块 开发环境,这样可以使用 typescript 提供的类型安全和类型提示便利性。

我们要实现下面的效果

  1. 文件目录

    • 在这里插入图片描述
  2. src/index.ts 注意是 esmodule 规范

    • 在这里插入图片描述
  3. 运行效果

    • 在这里插入图片描述

TSX 模块介绍

TSX 模块
TSX 是一个专为现代 Node.js 设计的 TypeScript 运行时,它替代了传统的 ts-node--loader 方案,特别适合在 ESM 环境下使用。

  1. 原生 ESM 支持
    - 完全支持 Node.js 的 ES Modules 规范
    - 无需额外的 --loader--experimental 标志
    - 自动处理 .ts.tsx 文件导入
  2. 高性能
    - 使用 Rust 编写的快速转译器 (基于 SWC)
    - 比传统 ts-node 快 5-20 倍
    - 智能缓存机制减少重复编译
  3. 零配置
    - 自动检测项目中的 tsconfig.json
    - 内置支持 TypeScript 路径映射
    - 自动处理 CommonJS 和 ESM 互操作
  4. 替代nodemon
    - tsx watch 会监视文件变化并自动重新加载

为什么选择 ESM?

ES Modules 是 JavaScript 的官方模块标准,相比传统的 CommonJS (CJS) 具有以下优势:

  • 静态分析能力,便于 tree-shaking
  • 浏览器原生支持
  • 更好的异步加载特性
  • 更清晰的模块语法

环境准备

确保你已安装:

  • Node.js 16+ (推荐 20+ 或最新 LTS 版本)
  • pnpm(推荐) 或者 npm 或 yarn
  • 代码编辑器 (VS Code 推荐)

项目初始化

mkdir ts-esm-project
cd ts-esm-project
pnpm init

安装必要依赖

pnpm install typescript @types/node --save-dev
pnpm install tsx --save-dev

配置 TypeScript

创建 tsconfig.json 文件:

{"compilerOptions": {"target": "ES2022","module": "NodeNext","moduleResolution": "NodeNext","outDir": "./dist","rootDir": "./src","strict": true,"esModuleInterop": true,"skipLibCheck": true,"forceConsistentCasingInFileNames": true,"baseUrl": ".","paths": {"@/*": ["src/*"]}},"include": ["src/**/*"],"exclude": ["node_modules"]
}

关键配置说明:

  • "module": "NodeNext" - 使用 Node.js 的模块系统
  • "moduleResolution": "NodeNext" - 使用 Node.js 的模块解析算法
  • "esModuleInterop": true - 允许与 CommonJS 模块互操作

配置 package.json

修改 package.json

{"type": "module","scripts": {"build": "tsc","start": "node ./dist/index.js","dev": "tsx watch src/index.ts","test": "NODE_OPTIONS='--import tsx' vitest"},"devDependencies": {"tsx": "^4.7.0","typescript": "^5.3.0"}
}

项目结构示例

ts-esm-project/
├── src/
│   ├── index.ts
│   ├── utils/
│   │   └── helper.ts
├── tsconfig.json
├── package.json

示例代码

src/index.ts:

import { readFile } from 'node:fs/promises';
import { helper } from '@/utils/helper';// 文件后缀js ts 或者不加都可以const main = async () => {const content = await readFile('./package.json', { encoding: 'utf-8' });console.log('Package content:', content);helper();
};main().catch(console.error);

src/utils/helper.ts:

export function helper() {console.log('Helper function called');
}

import { helper } from '@/utils/helper';// 文件后缀 js ts 或者不加都可以

开发工作流

  1. 开发模式​:

    npm run dev
    

    tsx watch 会监视文件变化并自动重新加载

  2. 生产构建​:

    npm run build
    

    生成的文件会输出到 dist/ 目录

  3. 运行生产代码​:

    npm start
    

常见问题解决(可能遇到)

1. 文件扩展名问题

ESM 要求导入时必须指定完整扩展名。解决方案:

// 正确
import './utils/index.js' 
// 正确
import './utils/index' 
// 正确
import './utils/index.ts' 
// 错误
import './utils'

2. __dirname 替代方案

ESM 中没有 __dirname,替代方案:

import { dirname } from 'node:path';
import { fileURLToPath } from 'node:url';const __dirname = dirname(fileURLToPath(import.meta.url));

3. 第三方模块兼容性

如果遇到 ESM/CJS 混合问题,可以尝试:

  1. 检查该模块是否有 ESM 版本

  2. 使用动态导入:

    const { default: pkg } = await import('some-package');
    

测试环境配置

推荐使用 Vitest:

npm install vitest --save-dev

vite.config.ts:

import { defineConfig } from 'vitest/config';export default defineConfig({test: {include: ['**/*.test.ts'],globals: true}
});

部署注意事项

  1. 生产环境应该运行编译后的 .js 文件

  2. 确保 package.json 中包含:

    {"type": "module","engines": {"node": ">=18.0.0"}
    }
    

总结

666666666666666666666666

http://www.xdnf.cn/news/10492.html

相关文章:

  • SpringMVC的注解
  • StarRocks物化视图
  • 可视化大屏通用模板Axure原型设计案例
  • 代码随想录60期day54
  • [leetcode] 二分算法
  • 密码学:解析Feistel网络结构及实现代码
  • 传送文件利器wormhole的使用方法
  • 【iOS】ARC 与 Autorelease
  • 数据库系统概论(十五)详细讲解数据库视图
  • Linux运维笔记:服务器安全加固
  • HTML 中 class 属性介绍、用法
  • AlmaLinux OS 10 正式发布:兼容 RHEL 10 带来多项技术革新
  • Kotlin 中的 companion object 使用指南
  • (LeetCode 每日一题)135. 分发糖果 ( 贪心 )
  • 电子电气架构 --- 如何应对未来区域式电子电气(E/E)架构的挑战?
  • 【安全】VulnHub靶场 - W1R3S
  • STM32:CAN总线精髓:特性、电路、帧格式与波形分析详解
  • 单元测试-断言常见注解
  • 探索大语言模型(LLM):参数量背后的“黄金公式”与Scaling Law的启示
  • 使用 OpenCV (C++) 进行人脸边缘提取
  • ASC格式惯导数据文件转IMR格式文件
  • window 显示驱动开发-驱动程序处理的Multiple-Processor优化
  • 使用 So-VITS-SVC 实现明星声音克隆与视频音轨替换实战全流程
  • 云部署实战:基于AWS EC2/Aliyun ECS与GitHub Actions的CI/CD全流程指南
  • SpringBoot-配置Spring MVC
  • 学习经验分享【40】目标检测热力图制作
  • 基于SpringBoot运动会管理系统设计和实现(源码+文档+部署讲解)
  • CppCon 2014 学习:Decomposing a Problem for Parallel Execution
  • 详解|证券、基金、期货:银证转账系统
  • 监控 100 台服务器磁盘内存CPU利用率