从零到一: 创建一个 TypeScript 7 项目

简介: 本文介绍如何从零创建一个基于 TypeScript 7 的 Node.js 项目。项目使用 ECMAScript 模块 (ESM),并提供两条构建路径。TypeScript 编译器负责生成可发布文件,webpack 负责生成独立的 bundle。

准备开发环境

请先确保已安装 Node.js,检查本地版本:

node --version

初始化项目:

mkdir new-typescript-project
cd new-typescript-project
npm init --yes

项目完成后的主要目录如下:

├── package.json
├── tsconfig.json
├── webpack.config.js
└── src
    └── index.ts

安装 TypeScript 和开发工具

TypeScript 7 的编译器使用 Go 重写为原生实现。tsc 可以直接执行编译和类型检查,但 TypeScript 7 暂未提供稳定的编程 API。ts-loader 和 typescript-eslint 等工具仍需通过编程 API 调用编译器,因此暂时依赖 TypeScript 6。

为帮助现有工具平稳过渡,TypeScript 团队发布了 @typescript/typescript6 兼容包。该兼容包可以让 TypeScript 7 的 tsc 与依赖 TypeScript 6 API 的工具并行运行。具体背景参阅 TypeScript 7.0 发布公告

本项目据此并行安装两个版本:

  • @typescript/nativetypescript@7.0.2 的别名,负责 tsc、直接构建、监听和类型检查。
  • typescript@typescript/typescript6@6.0.2 的别名,向 webpack、ts-loader 和 typescript-eslint 提供兼容 API。该依赖还提供 tsc6 命令,对应的编译器版本为 6.0.3。

安装开发依赖:

npm install --save-dev \
  "@eslint/js@^9.39.5" \
  "@typescript/native@npm:typescript@7.0.2" \
  "eslint@^9.39.5" \
  "eslint-config-prettier@^10.1.8" \
  "prettier@^3.9.6" \
  "ts-loader@^9.6.2" \
  "typescript@npm:@typescript/typescript6@6.0.2" \
  "typescript-eslint@^8.67.0" \
  "webpack@^5.109.2" \
  "webpack-cli@^7.2.2"

安装完成后,package.json 会包含以下开发依赖:

{
   
  "devDependencies": {
   
    "@eslint/js": "^9.39.5",
    "@typescript/native": "npm:typescript@7.0.2",
    "eslint": "^9.39.5",
    "eslint-config-prettier": "^10.1.8",
    "prettier": "^3.9.6",
    "ts-loader": "^9.6.2",
    "typescript": "npm:@typescript/typescript6@6.0.2",
    "typescript-eslint": "^8.67.0",
    "webpack": "^5.109.2",
    "webpack-cli": "^7.2.2"
  }
}

随后,可以检查两个编译器的版本:

npm exec -- tsc --version
npm exec -- tsc6 --version

预期输出:

Version 7.0.2
Version 6.0.3

配置 TypeScript 7

package.json 中声明 ESM,并设置项目的入口文件和发布内容:

{
   
  "type": "module",
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "files": ["dist", "src"]
}

创建 tsconfig.json:

{
   
  "compilerOptions": {
   
    "rootDir": "src",
    "outDir": "dist",
    "module": "NodeNext",
    "target": "ES2023",
    "types": [],
    "sourceMap": true,
    "inlineSources": true,
    "declaration": true,
    "declarationMap": true,
    "noUncheckedIndexedAccess": true,
    "exactOptionalPropertyTypes": true,
    "strict": true,
    "verbatimModuleSyntax": true,
    "isolatedModules": true,
    "noUncheckedSideEffectImports": true,
    "moduleDetection": "force",
    "skipLibCheck": true
  },
  "include": ["src/**/*.ts"],
  "exclude": ["node_modules", "dist"]
}

tsconfig.json 是 TypeScript 7 直接构建和 webpack 构建共用的项目配置。NodeNext 会结合 package.json 中的 "type": "module" 判断模块格式,使 dist/index.js 保持 ESM 格式。

编写并编译 TypeScript

创建 src/index.ts:

const ProjectName = "new-typescript-project";

function say(): string {
   
  return `This project is ${
     ProjectName}.`;
}

console.log(say());

package.json 中定义直接构建、监听和类型检查脚本:

{
   
  "scripts": {
   
    "build:ts": "tsc --project tsconfig.json",
    "watch": "tsc --project tsconfig.json --watch",
    "typecheck": "tsc --project tsconfig.json --noEmit"
  }
}

运行直接构建:

npm run build:ts

TypeScript 7 会生成 dist/index.js、声明文件、声明映射和源码映射。dist/index.js 的内容如下:

const ProjectName = "new-typescript-project";
function say() {
   
    return `This project is ${
     ProjectName}.`;
}
console.log(say());
export {
   };
//# sourceMappingURL=index.js.map

运行编译结果:

node dist/index.js

输出如下:

This project is new-typescript-project.

开发期间可以启动监听模式:

npm run watch

只检查类型而不写入文件:

npm run typecheck

使用 webpack 打包

对于当前 Node.js 项目,TypeScript 7 直接编译已经足够。webpack 是一条可选的构建路径。

tsc 负责类型检查和 JavaScript 编译,也会生成声明文件与源码映射。在本项目的 NodeNext 配置下,tsc 会保留模块边界,不会把入口文件及其依赖合并为单个文件。

webpack 会从入口开始分析模块依赖,并将项目代码和引用的模块合并为 dist/bundle.js。对于包含多个模块或第三方依赖的应用,单文件通常更便于交付。

配置相应的 loader 或 plugin 后,webpack 还可以处理 CSS、图片等资源。本文没有启用这些能力。

webpack 通过 ts-loader 加载 TypeScript。ts-loader 会从名为 typescript 的依赖中获取 TypeScript 6 兼容 API。webpack 仍使用同一个 tsconfig.json。更多配置方式请参阅 webpack TypeScript 指南

创建 ESM 格式的 webpack.config.js:

import path from "node:path";
import {
    fileURLToPath } from "node:url";

const currentDirectory = path.dirname(fileURLToPath(import.meta.url));

export default {
   
  mode: "production",
  entry: "./src/index.ts",
  devtool: "source-map",
  output: {
   
    filename: "bundle.js",
    path: path.resolve(currentDirectory, "dist"),
  },
  module: {
   
    rules: [
      {
   
        test: /\.tsx?$/,
        use: {
   
          loader: "ts-loader",
          options: {
   
            compilerOptions: {
   
              declaration: false,
              declarationMap: false,
            },
          },
        },
        exclude: /node_modules/,
      },
    ],
  },
  resolve: {
   
    extensions: [".ts", ".tsx"],
  },
};

webpack 构建会关闭声明文件输出。包文件和声明文件仍由 TypeScript 7 直接构建生成。

添加 webpack 构建脚本:

{
   
  "scripts": {
   
    "build:webpack": "webpack --config webpack.config.js"
  }
}

运行构建并执行生成的 bundle:

npm run build:webpack
node dist/bundle.js

webpack 会同时生成 dist/bundle.jsdist/bundle.js.map

配置 ESLint

ESLint 使用 flat config,并组合 @eslint/js 和 typescript-eslint 的推荐规则。具体配置方式参阅 typescript-eslint 入门指南

运行检查:

npm run lint

完整验证项目

check 是仓库健康检查。该脚本会依次检查格式、代码质量和类型,然后运行两条构建路径:

{
   
  "scripts": {
   
    "check": "npm run format:check && npm run lint && npm run typecheck && npm run build:ts && npm run build:webpack"
  }
}

执行完整检查:

npm run check

构建完成后,分别运行两个文件并比较输出:

node dist/index.js
node dist/bundle.js

两个命令都应输出:

This project is new-typescript-project.

参考资料

附录

案例: github.com/chengchuu/new-typescript-project

版权声明

本文为原创文章,作者保留版权。转载请保留本文完整内容,并以超链接形式注明作者及原文出处。

作者: 除除
原文: https://blog.mazey.net/6532.html

目录
相关文章
|
5天前
|
存储 人工智能 JSON
「它凭什么这么说」—— Semantica 让 AI 的每个结论都能翻回出处
Semantica 是面向 AI 系统的开源知识图谱与决策溯源平台,专注解决“AI 决策不可追溯”痛点。它不存向量,而构建可审计的上下文图,支持实体消歧、确定性推理、W3C 标准溯源与因果路径追踪,让每条结论均可查来源、验逻辑、担责任。
|
2月前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
3812 142
|
5天前
|
NoSQL 前端开发 安全
零成本邮件验证码全链路拆解,附最新 QQ 邮箱 SMTP 授权码完整步骤
本文详解个人项目“词帆CiFan”中邮件验证码功能的完整实现:选用QQ邮箱SMTP零成本方案,涵盖密码重置与账号注销两大核心场景,包含前后端链路设计、Redis降级容错、安全配置避坑(如授权码获取、端口选择、环境变量保护)及AI辅助开发技巧。
66 0
零成本邮件验证码全链路拆解,附最新 QQ 邮箱 SMTP 授权码完整步骤
|
1天前
|
自然语言处理 安全 数据管理
矿洞深处没有信号,靠什么实时上报故障?
矿洞无信号、设备故障难上报?非洲矿区自建井下局域网,实现故障实时上传、地面同步调度。不依赖公网,防爆终端+工业Wi-Fi+纯内网部署,兼顾安全合规与多语言支持,打通“最后一米”通信堵点。
|
1天前
|
人工智能 自然语言处理 监控
从系统上线到Agent上岗:AI客服部署架构、权限边界与人机接管机制解析
本文剖析AI客服从系统上线到Agent真正上岗的关键工程挑战:部署架构需明确运行节点与控制边界;权限设计须厘清用户、Agent与工具三重身份;任务执行需限定知识、数据、工具、动作及人工接管五层边界;人机接管本质是业务任务所有权的精准迁移。核心在于让每次执行可追溯、可授权、可确认、可交接。
23 0
|
1天前
|
敏捷开发 项目管理
CMMI为什么能提升软件成熟度?从起源讲清楚
想了解CMMI为何能提升软件成熟度?本文从1984年美国国防部外包危机讲起,剖析CMMI的起源、过程改进机制及常见误区,助你正确落地实践,避免证书与能力脱节。
|
1天前
|
人工智能 自然语言处理 前端开发
Qoder实战:一句话生成「贪吃蛇小游戏」新手0基础,太简单了!
Qoder实战教程:新手用一句话描述“贪吃蛇”玩法,调用qwen3.8-max模型,自动生成纯HTML/CSS/JS单文件小游戏,Canvas手绘、零依赖,浏览器打开即玩!适合教学、营销与AI编程入门。阿里云Qoder官网:https://t.aliyun.com/U/CpdGPQ
|
5天前
|
存储 机器人 数据安全/隐私保护
双通道自动备份系统实战:加密 + 明文 + 机器人取文件
本文介绍了一套基于Windows的双通道自动备份系统实战方案:支持加密备份与明文直传双链路,文件变更秒级响应、每小时全量兜底;集成机器人实现目录查询、翻页及按序号取文件;服务开机自启、崩溃自恢复,并可封装为一键安装包。兼顾安全、便捷与低成本。(239字)
|
5天前
|
SQL Java 关系型数据库
JDBC 初认识、速了解
JDBC(Java Database Connectivity)是Java访问关系型数据库的标准API,提供统一接口实现跨数据库操作。核心组件包括DriverManager、Connection、Statement/PreparedStatement和ResultSet,支持SQL执行与结果处理,是Java后端开发必备基础技术。
35 0
|
5天前
|
人工智能 自然语言处理 Linux
Claude Code 实现 Computer Use:让 AI 操控你的 Windows 电脑(MCP 平替方案)
本文介绍如何用开源Windows Control MCP插件,让Claude Code(无需Pro订阅)实现99%官方Computer Use功能:鼠标控制、键盘输入、截图等。仅需两行命令,兼容VS Code与CLI,专为国内用户优化,全免费、全可用。
78 0