编程 TypeScript 6.0深度解析:JS终章与Go重写序章——2026升级完全指南

2026-04-11 12:08:14 +0800 CST views 10

TypeScript 6.0 深度解析:JS 最后的「终章」与 Go 重写的序章——一份面向 2026 年的完整升级指南

写在前面

2026年3月23日,TypeScript 6.0 正式发布。

如果你只看版本号,可能觉得这就是一次普通的年度大版本更新。但如果你了解 TypeScript 团队背后在做什么,会发现 6.0 的意义远比它看起来要重大得多——

这是 TypeScript 有史以来最后一个基于 JavaScript 代码库的大版本。

从 7.0 开始,TypeScript 将彻底移植到 Go 语言,用原生代码和共享内存多线程重写整个编译器与语言服务。官方把这个项目代号为 "Project Corsa",而 TypeScript 6.0 就是为这场「换心手术」做准备的过渡版本。

作为一个写了五年 TypeScript 的开发者,我的感受是:6.0 不是那种「看完让人激动到想重写项目」的版本,但它绝对是一次必要的基础设施升级——它把旧时代的兼容包袱清理掉,把默认值往「现代 JavaScript / ESM / Bundler / Evergreen Runtime」这条路上统一,同时为即将到来的 Go 原生时代扫清障碍。

本文将从以下几个维度深入剖析 TypeScript 6.0,带你搞清楚:

  • TS6 到底变了什么,为什么这些变化很重要
  • 升级时最容易踩哪些坑,怎么避
  • TypeScript 7 (Go 重写) 现在进展到哪一步,性能提升有多炸
  • 怎么制定一个稳妥的升级路线图

一、TypeScript 6 的战略定位:为什么它不是「炫技型」版本

1.1 官方已经说得很清楚了

TypeScript 团队在发布说明里写得很直接:

TS6.0 是最后一个基于当前 JavaScript 代码库的正式大版本。

这句话的分量,可能很多人没有完全体会到。

TypeScript 自 2012 年诞生以来,核心编译器一直是 TypeScript 自己写的——一个用 TypeScript(后来加了 JavaScript)写的巨型类型检查器。这么多年下来,这个「自己编译自己」的系统积累了大量的历史包袱:

  • 为了兼容老旧浏览器,保留了大量 ES3/ES5 时代的编译策略
  • 为了兼容各种模块系统,moduleResolution 里有 node/classic/nodenext/bundler 四种算法并存
  • 为了兼容旧项目,默认值倾向于「保守」而非「现代」
  • 类型检查器的性能在面对百万行级别的代码库时,已经触及了 JavaScript 的天花板

这些问题在 TypeScript 5.x 时代已经越来越明显。团队决定:是时候来一次彻底的重构了。

1.2 TS6 的核心任务:为 TS7 铺路

TS6 的大量工作不是在「给自己加新功能」,而是在「提前对齐 TS7 的行为」。

具体来说,TS6 做了三件关键的事:

第一,清理即将在 TS7 中废弃的配置项

TS6 移除了 moduleResolution: "classic"、outFile、esModuleInterop: false 等老旧配置。如果 TS6 还留着这些,到了 TS7 就不得不做更大幅度的破坏性更新。现在在 TS6 中提前移除,可以让开发者在过渡期就发现问题,而不是被 TS7 一次性炸懵。

第二,把默认值改成「TS7 方向」

strict 默认变成 true、target 默认变成 es2025、module 默认变成 esnext——这些变化单独看可能觉得「这有什么好大惊小怪的」,但它们的核心意义是:让新项目从第一天起就用最现代的配置,而不是默认用十年前的默认值然后一点点往现代靠。

第三,提前感知 TS7 的行为变化

TS7 的类型检查逻辑会有调整,部分边界情况的行为会变。TS6 引入了 --stableTypeOrdering 这样的 flag,让开发者可以提前体验 TS7 的行为,等到真正迁移时不会有「这怎么跟以前不一样」的惊吓。


二、最值得关注的新变化:从配置到语法的全面梳理

2.1 编译配置默认值大改(最影响老项目)

这是 TS6 对大多数开发者影响最大的变化——不是语法层面的,而是配置层面的默认值迁移。

2.1.1 strict 默认变成 true

这是最重量级的一个变化。

在 TS6 之前,strict 模式是需要你手动显式开启的:

{
  "compilerOptions": {
    "strict": true
  }
}

很多老项目(尤其是 2018 年之前创建的)从一开始就没有开启 strict,导致代码里积累了大量的 any 类型滥用、null/undefined 检查缺失、this 隐式 any 等技术债。

TS6 把默认值改成了 true,意味着:如果你没有显式写 "strict": false,升级后你的项目突然会多出一批类型错误。

典型的报错场景:

// 老代码(TS5.x 下可能不报错)
function processData(data) {  // 参数 data 没有类型,隐式 any
  return data.toFixed();      // data 可能是 undefined,报错
}

// TS6 下的正确写法
function processData(data: number | undefined) {
  if (data === undefined) return;
  return data.toFixed();
}

我的建议是:不要急于接受 strict: true 的新默认值。 老项目升级时,先显式写回 "strict": false 稳住局面,等你把类型债梳理清楚之后再逐步收紧。

{
  "compilerOptions": {
    "strict": false
  }
}

新项目可以直接用 TS6 的默认值,从第一天就建立好的类型习惯。

2.1.2 types 默认变成 []

这是升级时最容易踩的坑之一。

TS6 之前,如果你不显式指定 types,TypeScript 会自动扫描 node_modules/@types 下的所有包。这意味着你写 Node.js 代码时,不需要 import 'node' 就能用 process、Buffer 等全局类型;写 Jest 测试时,不需要额外配置就能用 describe、it 等全局函数。

TS6 把这个行为改了——现在 types 默认为空数组,不再自动引入任何 @types 包。

升级后常见报错:

Cannot find name 'process'
Cannot find name 'describe'
Cannot find name 'Buffer'
Cannot find module 'fs'

解决方案:按需显式引入需要的类型包。

{
  "compilerOptions": {
    "types": ["node", "jest"]
  }
}
// 现在需要显式引入(有些全局类型仍可直接用,但建议显式)
import { describe, it, expect } from '@jest/globals';

我的建议是:Node.js 项目优先加 "node",有测试框架的项目加对应的 @types 包。 不要因为懒得配置就设成 "types": ["*"],那只是把问题往后拖。

2.1.3 rootDir 默认变成当前目录

TS6 之前,TypeScript 会尝试推断一个公共源目录作为 rootDir(通常是你所有 .ts 文件的最长公共前缀)。

TS6 现在直接把 tsconfig.json 所在的目录当作 rootDir。

这会导致什么问题?输出文件的目录层级可能会变深。

举个例子,假设你的项目结构是:

project/
├── tsconfig.json
└── src/
    ├── index.ts
    └── utils/
        └── helper.ts

升级前(rootDir 推断为 ./src):

dist/index.js
dist/utils/helper.js

升级后(rootDir 变成了 project/):

dist/src/index.js          ← 多了 src 这一层
dist/src/utils/helper.js

解决方案:显式指定 rootDir。

{
  "compilerOptions": {
    "rootDir": "./src",
    "outDir": "./dist"
  },
  "include": ["src"]
}

2.1.4 targetmodule 默认值更新

TS6 引入了「year-based versioning」策略:

  • target 默认变成 es2025(当前年份对应的 ES 版本)
  • module 默认变成 esnext
  • moduleResolution 不再支持 node/classic(如果你还在用,要改成 bundler 或 nodenext)

这些变化对老项目的影响相对小一些(因为大多数现代项目本来就在用 esnext/bundler),但对那些还在输出 ES5/CommonJS 的老项目来说,需要认真评估是否要升级。

2.2 JavaScript 新功能同步:TS6 的语法亮点

除了配置层面的变化,TS6 也同步了 JavaScript 标准的几个重要新功能。

2.2.1 Map 新方法:getOrInsertgetOrInsertComputed

这是 ES2025 引入的两个非常实用的 Map 实例方法,TS6 现在完整支持了类型定义。

以前写这种「先检查再设置」的模式很繁琐:

// 传统写法
if (!cache.has(key)) {
  cache.set(key, computeExpensiveValue(key));
}
return cache.get(key)!;

现在一行搞定:

// TS6 + ES2025
const value = cache.getOrInsert(key, computeExpensiveValue(key));

getOrInsertComputed 则是懒加载版本,只在 key 不存在时才执行计算函数:

const value = cache.getOrInsertComputed(key, () => {
  // 这个函数只在 key 不存在时才执行
  return computeExpensiveValue(key);
});

实际应用场景——Vite 源码中的用法:

// Vite 源码(TS6 前)
if (!hmrClient.dataMap.has(ownerPath)) {
  hmrClient.dataMap.set(ownerPath, {});
}
const modules = hmrClient.hotModulesMap.get(ownerPath);

// Vite 源码(TS6 后)
hmrClient.dataMap.getOrInsert(ownerPath, {});
const modules = hmrClient.hotModulesMap.getOrInsert(ownerPath, new Map());

这种场景在现代前端工具链中极其常见——HMR、缓存管理、依赖图构建都用得上。一行代码消灭样板代码,更符合人体工程学。

2.2.2 Temporal API:终于有了靠谱的日期时间处理标准库

这是 JavaScript 生态期待已久的 API,被设计来彻底取代有问题的 Date 对象。

// TS6 现在内置了 Temporal 的类型定义
const now = Temporal.Now.instant();
const tomorrow = now.add({ days: 1, hours: 6 });

// 计算时间差
const diff = tomorrow.since(now);
console.log(`距离明天还有 ${diff.total({ unit: 'hours' })} 小时`);

Temporal API 的优势在于:

  • 不可变设计:所有操作返回新实例,不会意外修改原对象
  • 清晰的语义InstantPlainDateTimeZonedDateTime 区分明确
  • 完整的时区支持:不需要再和 getTimezoneOffset 搏斗
  • 纯粹的 API:没有 Date 的那些奇怪行为(月份从0开始等)

虽然不是所有运行时都原生实现了 Temporal(Chrome 95+、Firefox 101+、Safari 16.4+),但 TS6 已经在类型层面完整支持了。你可以用 polyfill(如 @js-temporal/polyfill)来获得运行时支持,TS 的类型检查完全没问题。

2.2.3 RegExp.escape:终于不用手写转义函数了

这是一个被提了很多年的标准库提案,TS6 终于支持了。

// 以前:手写转义函数
function escapeRegex(str: string): string {
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

// 现在:标准库直接用
function matchWholeWord(word: string, text: string) {
  const escaped = RegExp.escape(word);  // 正确转义所有特殊字符
  const regex = new RegExp(`\\b${escaped}\\b`, 'g');
  return text.match(regex);
}

RegExp.escape 会自动转义以下字符:^ $ \ . * + ? ( ) [ ] { } |,让你不再需要记忆或查表。

2.3 #/ 子路径导入:更好的模块组织方式

Node.js 的 imports 字段早就支持子路径导入了,但以前必须写成像 #root/utils/sum.js 这种形式。TS6 跟进了 Node 的新能力,现在可以这样配:

{
  "name": "my-package",
  "type": "module",
  "imports": {
    "#/*": "./src/*"
  }
}

然后在代码里直接:

// 不用再写 ../../../utils/sum
import { sum } from "#/utils/sum.js";
import { createApp } from "#/app.js";

好处是什么?

  1. 路径更稳定:无论文件在哪个层级,导入路径永远一致
  2. 重构更安全:移动文件时只需要改 package.json 的映射
  3. 语义更清晰# 前缀明确表示这是「包内私有路径」

使用条件:需要 moduleResolution 设为 nodenextbundler

2.4 方法推断优化:对象方法不再「别扭」

这是 TS6 最容易被低估的一项改进,也是对日常编码体验影响很大的变化。

以前 TypeScript 在处理对象方法时会有奇怪的「看人下菜碟」现象:

// 箭头函数,推断正常
const obj1 = {
  consume: (y) => y.toFixed()
};

// 普通方法语法,某些场景下推断会变差
const obj2 = {
  consume(y) {
    return y.toFixed();  // y 可能会被推成 unknown
  }
};

这种不一致性在泛型场景下尤为明显:

declare function callIt<T>(obj: {
  produce: (x: number) => T;
  consume: (y: T) => void;
});

callIt({
  consume(y) {  // TS5.x: y 可能被推成 unknown
    return y.toFixed();
  },
  produce(x) {
    return x * 2;
  }
});

TS6 修了这个问题:如果对象方法里没有用到 this,TypeScript 就不把它当作上下文敏感的处理,不再随意把参数推成 unknown。

这带来的实际好处:

  • 可以更自然地写对象方法,不用被迫改成箭头函数
  • 泛型推断更稳定,减少「明明应该推断出来但偏偏推成 any」的困惑
  • 少写很多「本来不该补」的显式类型标注

三、破坏性更新清单:TS6 移除了什么

TS6 清理了大量历史包袱,以下是你必须知道的变化。

3.1 moduleResolution: "classic" 彻底移除

这是最早的模块解析算法,诞生于 TypeScript 1.5 时代(2015年)。如果你还在用:

{
  "compilerOptions": {
    "moduleResolution": "classic"
  }
}

TS6 会直接报错。

现代方向很明确:

  • 前端/Bundler 项目:用 bundler
  • Node.js ESM 项目:用 nodenext

3.2 outFile 被移除

如果你还在用 TypeScript 自己来合并多个输入文件:

{
  "compilerOptions": {
    "outFile": "./dist/bundle.js"
  }
}

TS6 不再支持这个选项。

官方的态度很明确:TypeScript 的职责是类型检查和声明生成,不是 bundler。文件合并应该交给专业的工具:

  • esbuild
  • Vite(Rolldown)
  • Rollup
  • Webpack
  • Parcel

3.3 esModuleInterop: falseallowSyntheticDefaultImports: false 不再允许

TS6 把这两个选项的默认值锁定为 true,不再允许设置成 false。

**这意味着:**你不能再说「我就是要禁用这个行为」。现代 JavaScript 模块互操作已经是主流,不应该再开倒车。

如果你还在用旧的导入方式:

// TS6 前
import * as express from "express";

// TS6 后推荐
import express from "express";

3.4 import assertions 写法废弃,改用 with

JSON import 的语法变了:

// 废弃写法
import data from "./data.json" asserts { type: "json" };

// 新写法
import data from "./data.json" with { type: "json" };

这个变化和 ES 模块的演进一致。如果你项目里有大量 JSON import、WASM import、CSS module attribute 等实验性写法,升级前最好全局搜索替换。

3.5 在有 tsconfig.json 的目录里直接 tsc foo.ts 会报错

这是一个很小但很常见的陷阱。

以前很多人会在项目目录里直接执行:

tsc src/index.ts

TS6 现在会报错,因为它发现当前目录有 tsconfig.json,担心你想用配置文件但实际没用上。

如果你真的就是想忽略配置、只按默认行为编译单个文件,需要显式指定:

tsc --ignoreConfig src/index.ts

3.6 最低输出版本要求提升到 ES2015

TS6 不再支持输出 ES5。如果你还在配:

{
  "compilerOptions": {
    "target": "es5"
  }
}

需要改成 es2015 或更高版本。IE 浏览器已经彻底淘汰,ES5 的市场份额几乎为零,这个变化早就该来了。

3.7 amdumdsystemjs 模块格式被废弃

后 ES6 时代,模块系统已经高度统一为 ESM + CJS。这三种「非主流」格式的支持成本已经大于收益,TS6 把它们标记为废弃。


四、TypeScript 7:Go 重写到底进展到哪一步了

4.1 官方进度通报(2025年12月)

TypeScript 团队在 2025 年底发布了一篇详细的进度报告,揭示了 Project Corsa(Go 重写项目)的实际状态。

一句话总结:比你想象的更接近可用状态。

TypeScript 7 的 Go 原生实现(代号 Project Corsa)已经具备以下能力:

编辑器支持(Language Service)

以下功能已经可以在 VS Code 中使用(通过 TypeScript Team 的官方预览扩展):

  • ✅ 代码补全(Auto-completions)
  • ✅ 跳转到定义(Go-to-Definition)
  • ✅ 跳转到类型定义(Go-to-Type-Definition)
  • ✅ 跳转到实现(Go-to-Implementation)
  • ✅ 查找所有引用(Find-All-References)
  • ✅ 重命名(Rename)
  • ✅ 悬停信息(Hover Tooltips)
  • ✅ 签名帮助(Signature Help)
  • ✅ 格式化(Formatting)
  • ✅ 选区范围(Selection Ranges)
  • ✅ 代码透镜(Code Lenses)
  • ✅ 调用层级(Call Hierarchy)
  • ✅ 文档符号(Document Symbols)
  • ✅ 自动导入缺失模块(Quick Fixes for Missing Imports)

最关键的几个功能(自动导入、查找引用、重命名)刚刚才移植完成,意味着开发者体验已经基本可用。

编译器进度

TypeScript 7 的类型检查现在已经非常接近完整。

官方数据:TypeScript 有约 20,000 个编译器测试用例,其中约 6,000 个在 TS6 中会产生至少一个错误。TS7 在除 74 个案例之外的所有案例中都产生了相同的错误。

这 74 个剩余案例都是已知的未完成工作(如正则语法检查、isolatedDeclarations 相关的错误)或已知的预期行为变化(废弃项、默认设置变更)。

这意味着:你现在就可以用 TypeScript 7 来检查你的项目,错误检测能力已经非常可靠。

构建模式(--build mode)已移植

# 用 TS6 编译
tsc -b some.tsconfig.json --extendedDiagnostics

# 用 TS7 编译(tsgo)
tsgo -b some.tsconfig.json --extendedDiagnostics

--incremental、项目引用(project references)、--build 模式都已移植完成。

4.2 性能对比:10 倍提速是真的吗?

这是大家最关心的问题:Go 重写后的 TS7 到底有多快?

官方给出的基准测试数据(2025年12月):

项目TS6 (tsc)TS7 (tsgo)加速比
Sentry133.08s16.25s8.19x
VS Code89.11s8.74s10.2x
TypeORM15.80s1.06s9.88x
Playwright9.30s1.24s7.51x

平均提速约 8-10 倍。

对于 VS Code 这样百万行级别的巨型代码库,从 89 秒降到 8.74 秒意味着什么?本地开发时,一次完整的增量构建几乎可以做到「秒级响应」。

为什么能这么快?

两个核心原因:

  1. Go 的原生性能:Go 编译出来的二进制代码比 JavaScript(Node.js)执行效率高得多。类型检查是 CPU 密集型任务,原生代码天然有优势。

  2. 共享内存多线程:JavaScript 是单线程的(即使有 Worker,也很难高效共享内存)。Go 的 goroutine + 共享内存模型让 TS7 可以真正并行处理多个文件的类型检查,而且可以跨项目并行构建(tsgo -b 能同时构建多个引用的子项目)。

4.3 怎么提前体验 TS7

方式一:VS Code 预览扩展

安装 TypeScript Team 的 Native Preview 扩展,每天自动更新。装好后你的 VS Code 就会用 TS7 的语言服务替代内置的 TS 语言服务,可以体验完整的编辑体验(10 倍快的自动补全、跳转到定义等)。

方式二:命令行尝鲜

# 安装 TS7 预览版
npm install -D @typescript/native-preview

# 用 tsgo 替代 tsc
npx tsgo --version
npx tsgo -b tsconfig.json

tsgo 的用法和 tsc 基本一致,可以并存使用。


五、升级指南:从 TS5.x 到 TS6 的实战路线图

5.1 升级前的准备工作

第一步:备份 + 锁版本

# 在 package.json 中锁定当前版本
npm install typescript@5.9 --save-dev
git add package.json package-lock.json
git commit -m "chore: lock typescript@5.9 before upgrading to 6"

第二步:安装 TS6

npm install typescript@6 --save-dev

第三步:先跑类型检查,不要慌

npx tsc --noEmit

你会看到一堆报错。不要慌,这是正常的。先把最关键的错误识别出来。

5.2 快速止血:先把报错压下去

如果你的项目在升级后报错满天飞,最快的止血方法是:

{
  "compilerOptions": {
    "strict": false,
    "types": ["*"],
    "moduleResolution": "node"
  }
}

加上这两个:

{
  "compilerOptions": {
    "ignoreDeprecations": "6.0"
  }
}

这样可以让项目暂时回到「能跑」的状态,但 ignoreDeprecations 只是过渡手段——TS7 会彻底移除这些被废弃的选项。

5.3 按优先级处理配置变化

我建议按这个顺序处理:

P0(立即处理,影响构建):

  • rootDir/outDir 配置——检查输出文件路径是否正确
  • moduleResolution 是否为 classic——改成 bundler 或 nodenext
  • outFile——迁移到 bundler

P1(本周内处理,影响类型安全):

  • types 配置——显式引入 node/jest 等需要的 @types 包
  • esModuleInterop 是否被手动禁用——不需要再配置,TS6 默认开启

P2(本月内处理,为 TS7 铺路):

  • strict 模式——逐步开启,用 // @ts-expect-error 标注历史债
  • target 版本——考虑提升到 es2015 或更高
  • import assertions → with 语法迁移

5.4 一个推荐的过渡配置

对于从老项目升级,以下配置可以在「现代感」和「兼容性」之间取得平衡:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": false,
    "esModuleInterop": true,
    "rootDir": "./src",
    "outDir": "./dist",
    "types": ["node"],
    "ignoreDeprecations": "6.0"
  },
  "include": ["src"]
}

等项目稳定之后,再逐步收紧 strict、target 等选项。


六、TypeScript 的未来:从 JS 到 Go,从工具到生态

6.1 为什么选择 Go 而不是 Rust/C++/Zig?

这是很多人问的问题。TypeScript 团队在官方博客里解释过原因:

  • Go 的编译速度极快:TS7 的开发团队本身也要用 TS7 来编译自己,Go 的「快速编译 + 慢速运行」模型非常适合这个场景
  • 优秀的并发模型:goroutine + channel 让多线程并行类型检查写起来很自然
  • 成熟的工具链:调试器、性能分析器、IDE 支持都很完善
  • 团队熟悉度:TypeScript 团队之前做过很多 Go 相关的项目,对这门语言有积累

Rust 的缺点是学习曲线太陡,编译时间长;C++ 的缺点是维护成本高;Zig 太小众。Go 是一个「刚刚好」的选择。

6.2 TS7 发布后,JS 版本会被废弃吗?

不会。

TypeScript 7 (Go) 是对 TS6 功能的完整移植,不会删除任何功能或改变 TS 的语言特性。JS 代码库仍然会保留(作为 TS 自身的开发工具),但不会作为正式发布的版本。

对于普通开发者来说,唯一需要改变的是:把 tsc 换成 tsgo。API 完全兼容,迁移成本极低。

6.3 对前端开发生态的影响

TS7 的 10 倍提速会在几个方面产生深远影响:

CI/CD 流水线重构

类型检查往往是大项目 CI 中最耗时的步骤之一。10 倍提速意味着:

  • PR 检查时间从 10 分钟降到 1 分钟
  • 大型 monorepo 的增量构建从不可接受变成「秒级响应」
  • 可以把类型检查重新纳入 pre-commit hook

IDE 体验升级

VS Code 内置的 TS 语言服务基于 JS 版本,响应速度一直是痛点。TS7 的原生语言服务会从根本上解决这个问题。

更激进的类型检查策略

当类型检查足够快,「严格模式」的性能代价就不再是问题。团队可以更放心地开启 --strict,享受更强的类型安全保障。


七、总结:TS6 的正确打开方式

7.1 如果你是新项目

直接用 TS6 的默认值。

{
  "compilerOptions": {
    "target": "ES2025",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "types": []
  }
}

从第一天就建立现代、严格的类型规范,不需要经历「从松到紧」的迁移阵痛。

7.2 如果你是老项目

把 TS6 升级当成一次技术债清理的机会。

不要只改个版本号就上线。花 1-2 天时间:

  1. 跑 TS6 看报错
  2. 先止血(strict: false)
  3. 逐个解决 types 配置
  4. 迁移 moduleResolution
  5. 逐步开启 strict

这次清理完,到了 TS7 迁移时你会轻松很多。

7.3 写在最后

TypeScript 6.0 可能不是那种「震撼发布」,但它是一次非常重要的基础设施升级。它清理了十年的历史包袱,把默认值拉到现代标准,同时为 Go 原生时代的到来做好了准备。

对于前端生态来说,TS7 的 10 倍提速会是一个转折点——类型检查将不再是「慢就慢点吧」的妥协项,而是可以放心开启的性能优先选项。

新项目直接上 TS6,享受现代 TypeScript。
老项目认真做一次升级,为 TS7 铺好路。

这场从 JavaScript 到 Go 的「换心手术」,值得期待。


参考资料

推荐文章

Go 接口:从入门到精通
2024-11-18 07:10:00 +0800 CST
为什么大厂也无法避免写出Bug?
2024-11-19 10:03:23 +0800 CST
JavaScript 上传文件的几种方式
2024-11-18 21:11:59 +0800 CST
纯CSS绘制iPhoneX的外观
2024-11-19 06:39:43 +0800 CST
Vue3中的虚拟滚动有哪些改进?
2024-11-18 23:58:18 +0800 CST
Go语言SQL操作实战
2024-11-18 19:30:51 +0800 CST
PHP 代码功能与使用说明
2024-11-18 23:08:44 +0800 CST
黑客帝国代码雨效果
2024-11-19 01:49:31 +0800 CST
15 个 JavaScript 性能优化技巧
2024-11-19 07:52:10 +0800 CST
`Blob` 与 `File` 的关系
2025-05-11 23:45:58 +0800 CST
使用xshell上传和下载文件
2024-11-18 12:55:11 +0800 CST
html文本加载动画
2024-11-19 06:24:21 +0800 CST
Go的父子类的简单使用
2024-11-18 14:56:32 +0800 CST
Golang 中你应该知道的 noCopy 策略
2024-11-19 05:40:53 +0800 CST
2024年微信小程序开发价格概览
2024-11-19 06:40:52 +0800 CST
支付页面html收银台
2025-03-06 14:59:20 +0800 CST
程序员茄子在线接单