学习笔记学习笔记
主站博客
面试
前端
开发工具
Cesium
GitHub
主站博客
面试
前端
开发工具
Cesium
GitHub
  • 前端
  • 微前端

    • qiankun

      • qiankun 实现隔离原理
  • 模块化

    • 导入

      • js导入的几种形式
      • import.meta.glob

        • 详解 import.meta.glob
    • JSX

      • /fe/module/jsx/
      • pragma: jsx 如何理解
      • Rollup+Babel 对比 Gulp+TypeScript
    • npm link

      • npm link
    • npm-vs-gitsubmodule

      • npm和git submodule 对比
  • 性能优化

    • 性能优化
    • 代码分隔

      • 代码分隔
  • TypeScript

    • ts的infer介绍
    • ts的工具类型(Utility Types)

Rollup+Babel 对比 Gulp+TypeScript

这段代码能够成功使用 Rollup 和 Babel 也能成功编译 TypeScript,是因为它采用了 Gulp 生态系统结合 TypeScript 官方编译器的方案,形成了一套独立的构建流程。以下是具体原因和工作原理:

1. 核心工具:Gulp + TypeScript 官方编译器

代码的核心是通过 gulp-typescript 插件直接集成了 TypeScript 官方编译器(typescript 包),替代了 Rollup 或 Babel 的角色:

  • gulp-typescript 是 Gulp 的 TypeScript 编译插件,内部直接调用 TypeScript 官方的 tsc 编译器进行转译。
  • 配置通过 ts.createProject 读取 tsconfig.json,并结合自定义的 compilerOptions(如 target、module 等),实现 TypeScript 到 JavaScript 的转译。

2. 为什么不需要 Rollup?

Rollup 的核心作用是模块打包(将多个模块合并为少数几个输出文件),而这段代码的目标更偏向于文件到文件的转译(保持模块结构):

  • 代码使用 Gulp 的流(stream)处理模式,对每个 .ts 文件单独转译,输出对应的 .js 文件(保持原目录结构)。
  • 通过 gulp.dest(outputPath) 直接将转译后的文件写入输出目录,无需 Rollup 的打包能力。
  • 如果需要打包,可能会用到 Rollup,但这里的场景更简单(仅转译),所以不需要。

3. 为什么不需要 Babel?

Babel 的核心作用是语法降级(如将 ES6+ 转为 ES5 以兼容旧环境),而这段代码通过 TypeScript 自身实现了类似功能:

  • TypeScript 编译器(tsc)本身就支持语法降级,通过配置 compilerOptions.target(如 es2016)可以指定输出的 JavaScript 版本。
  • 代码中 getTSCompilerOptions 函数明确设置了 target: 'es2016',让 TypeScript 直接将代码转译为指定版本的 JavaScript,无需 Babel 介入。
  • 对于更复杂的降级需求(如特定浏览器兼容),可能需要 Babel,但这里的需求通过 TypeScript 自身即可满足。

4. 其他辅助工具的作用

代码中集成了多个 Gulp 插件,补充了编译过程中的其他需求:

  • gulp-sourcemaps:生成 sourcemap,方便调试(对应 sourceMap 配置)。
  • gulp-replace:替换代码中的环境变量(envs 配置)。
  • terser:对输出的 JavaScript 进行简单压缩(移除死代码、调试语句等)。
  • through2:自定义流处理逻辑(如处理 CSS 注入、克隆文件等)。
  • merge2:合并多个流(同时处理 .js、.d.ts 输出)。

总结

这段代码本质上是一个基于 Gulp 的 TypeScript 转译流程:

  • 用 gulp-typescript + 官方 typescript 实现 TS→JS 转译和类型声明文件(.d.ts)生成。
  • 用 Gulp 插件链处理转译后的文件(压缩、替换、sourcemap 等)。
  • 由于不需要模块打包(Rollup 的核心功能)和复杂语法降级(Babel 的核心功能),因此无需依赖这两个工具。

这种方案更适合需要保持文件结构的转译场景(如库开发),而 Rollup/Babel 则适用于更复杂的应用打包或兼容性处理场景。

在 GitHub 上编辑此页
上次更新:
贡献者: 国wei
Prev
pragma: jsx 如何理解