【问题标题】:Build and distribute a Typescript project构建和分发 Typescript 项目
【发布时间】:2026-01-13 14:30:01
【问题描述】:

我有一个打字稿项目,当我开发它时,代码分散在许多文件中。

我想将该项目分发为单个 js 和 d.ts 文件 - 最好的方法是什么?

【问题讨论】:

  • 这取决于你想在哪里分发你的项目。如果您希望它可供全世界使用,那么您可以使用 npm。如果此项目与业务相关,那么您可能不应该在您的组织之外发布它。内部使用很大程度上取决于您的项目工具。
  • 我将使用 npm。但我的问题更侧重于合并多个文件并通过简单的步骤创建一个js和一个d.ts文件
  • 顺便说一句,如果问题不是关于如何分发而是如何创建单个 js 包,那么您有几个选择:如果您使用导入和命名空间的引用样式,那么 typescript 可以自己生成包;如果您使用 es6 导入,则有外部捆绑器,例如 webpack。
  • 和生成声明文件查看--declaration标志typescript compiler
  • @PavelAgarkov 当你说“typescript 可以自己生成 bundle”时,你能告诉我如何或指导我去写一篇文章吗?谢谢

标签: typescript npm


【解决方案1】:

打包文件时,通常无需将其合并为一个文件。使用包管理器(例如 NPM),您的文件将被捆绑到一个包中,您可以保持私有或公开,并且该包包含运行模块所需的所有文件。

特别是对于 TypeScript,您将打包 .js.d.ts 文件,这意味着您的包将适用于 TypeScript 和 JavaScript 使用者。您不会将 .ts 文件添加到包中。

如果您同时针对浏览器和 Node 环境,您可以使用UMD 模块,它们在这两种环境中都可以使用。

实际示例 - TypeSpec。

请注意 - 我已将整个文件放在下面以确保上下文存在,但重要的部分通常是一两行,我已突出显示。

TypeScript 配置文件 - 重要的位是“模块”类型和发出“声明”文件。

{
  "compileOnSave": true,
  "compilerOptions": {
    "target": "ES5",
    "module": "umd", // <--
    "strict": true,
    "experimentalDecorators": true,
    "noEmitOnError": false,
    "noFallthroughCasesInSwitch": true,
    "noImplicitReturns": true,
    "sourceMap": true,
    "removeComments": false,
    "declaration": true, // <--
    "downlevelIteration": true,
    "noUnusedLocals": true,
    "noUnusedParameters": false
  }
}

Gulp 文件 - 这会将文件移动到 dist 文件夹中,包括 package.json 和自述文件,但最重要的是所有 JavaScript 和类型定义。

var gulp = require('gulp');

gulp.task('default', function () {
    gulp.src('./node_modules/requirejs/require.js')
        .pipe(gulp.dest('./lib'));

    // This bit moves type definitions
    gulp.src('./Scripts/TypeSpec/*.d.ts')
        .pipe(gulp.dest('./dist/src'));

    // And this bit moves the JavaScript
    gulp.src('./Scripts/TypeSpec/*.js')
        .pipe(gulp.dest('./dist/src'));

    gulp.src('../README.md')
        .pipe(gulp.dest('./dist'));

    gulp.src('./package.json')
        .pipe(gulp.dest('./dist'));
});

package.json 文件提示主源文件和类型信息可以在“main”和“types”部分中找到:

{
  "author": "Steve Fenton",
  "name": "typespec-bdd",
  "description": "BDD framework for TypeScript.",
  "keywords": [
    "typespec",
    "typescript",
    "bdd",
    "behaviour",
    "driven"
  ],
  "version": "0.7.1",
  "homepage": "https://github.com/Steve-Fenton/TypeSpec",
  "bugs": "https://github.com/Steve-Fenton/TypeSpec/issues",
  "license": "(Apache-2.0)",
  "files": [
    "src/"
  ],
  "repository": {
    "url": "https://github.com/Steve-Fenton/TypeSpec"
  },
  "main": "./src/TypeSpec.js", <-- main file
  "types": "./src/TypeSpec.d.ts", <-- type information starts here
  "dependencies": {},
  "devDependencies": {
    "gulp": "^3.9.1",
    "requirejs": "^2.3.5"
  },
  "optionalDependencies": {},
  "engines": {
    "node": "*"
  }
}

你现在有了一个“dist”文件夹,里面只有你需要打包的文件。您可以在不使用发布到 NPM 的情况下试用它。

npm pack 

【讨论】:

  • 感谢您的详细回答 - 还有一件事我不清楚 - 我希望这一切都在打字稿中的单个导入语句中,所以我的代码用户只需执行 import * as utils from '@module.utils' 当我开发的时候,我会把它放在单独的更容易维护的文件中。我该如何做到这一点?
  • 其中一部分是架构性的,如果您查看 TypeSpec 项目,它会重新导出消费者可能需要的任何内容,这意味着他们只需要了解*模块文件,即如果有人导入*模块,他们可以访问模块的公共接口......他们不需要知道可能有很多文件支持该接口。
  • 谢谢 - 感谢您的帮助
最近更新 更多