【问题标题】:How do I compile TypeScript code into a single .js file, executable via "node mycode.js"?如何将 TypeScript 代码编译成单个 .js 文件,可通过“node mycode.js”执行?
【发布时间】:2021-06-20 06:53:30
【问题描述】:

我希望能够在没有 webpack、gulp 等的情况下做到这一点,只需“tsc [args] mycode.ts”。这可能吗?

在我的 package.json 中,我有一个这样的构建命令:

    "build:mycode": "tsc --allowSyntheticDefaultImports --lib es2018 --lib dom -m amd -t es2018 --moduleResolution node --outFile ./mycode.js ./mycode.ts",

(以上所有配置都是使用tsc 命令行参数完成的,而不是在tsconfig.json 中设置的原因是我正在生成一个与我的主项目不同的构建脚本,确实使用tsconfig.json、webpack 等)

我尝试使用-m commonjs,但--outFile 不允许使用,只能使用amdsystem

问题是这样生成的代码在被node调用时会产生这个错误:

ReferenceError: define is not defined

我不知道如何定义definenode 命令是否有提供必要定义的参数?到目前为止,我在 Google 上搜索到的所有内容都调用了我宁愿避免使用的额外工具,或者是针对 web browser 而不是创建命令行工具。

注意:任何涉及<scr ipt> 标签的解决方案都不适用。

【问题讨论】:

  • deno bundle 这样做,您可以提供自己的 TSConfig 作为参数
  • @jsejcksn,不幸的是,它看起来像输出单文件模块,而不是可执行文件,而且看起来也是面向网络的。
  • 在这种情况下,您的问题不清楚。如果不是捆绑包,“单个文件”是什么意思?另外,我不确定您所说的“面向网络”是什么意思。 Deno 简单地捆绑了 ECMAScript 模块(可选地以 IIFE 格式作为选项)。任何与环境相关的配置(window 等全局变量)都取决于您的 TSConfig。
  • 通过“面向网络”,我看到该文档中使用的代码带有<script> 标签,并且还以这样一种方式捆绑,即通过包含捆绑包不会自动执行任何内容,它只会提供定义可以调用。我希望“node mycode.js”立即执行代码,而不仅仅是返回一个我可以调用来执行该代码的函数。
  • 我现在了解您的担忧。我认为现在是研究 ES 模块的好时机。

标签: javascript node.js typescript


【解决方案1】:

无法使用tsc--outFile 参数将CommonJS 模块连接到单个文件。请参阅https://github.com/microsoft/TypeScript/issues/7252 进行讨论。

您需要使用捆绑器(例如 webpack)来实现您的目标。


原答案:

使用tsc 编译单个文件时,不需要--outFile 参数。此外,--lib 选项接受一个 arg 或一个(逗号分隔的)列表。这是您的示例的修改版本:

tsc \
  --allowSyntheticDefaultImports \
  --lib es2018,dom \
  --module commonjs \
  --target es2018 \
  --moduleResolution node \
  ./script.ts

这不会捆绑您的脚本,而只是将其转换为 JavaScript。它仍将依赖任何外部导入。

【讨论】:

  • 我已经试过了。该文件导入了我的另外两个文件,没有--outFile,我最终会生成三个.js 文件,而不仅仅是一个。
  • @kshetline 感谢您的澄清;我已经更新了我的答案。
  • @kshetline 您尚未分享有关您的项目的任何详细信息/要求,但 CLI 脚本正是 Deno 解决的问题,因此它可能非常适合您的用例。这是手册中的一个示例:deno.land/manual@v1.10.1/examples/unix_cat
【解决方案2】:

这是我制作的一个简单脚本。它应该适用于您的用例

#!/bin/sh

SRCDIR=src
OUTDIR=build
pre_clean(){
    if [ -f build/index.js ];
    then
        rm build/index.js
    fi
}

pre_clean
mkdir -p tmp
mkdir -p $OUTDIR


tsc $SRCDIR/*.ts --outDir tmp

cd tmp

for file in *.js
do
    echo "// $file " >> ../$OUTDIR/index.js
    echo "" >> ../$OUTDIR/index.js
    cat $file >> ../$OUTDIR/index.js
    # sed 1,2d $file >> ../$OUTDIR/index.js
    echo "" >> ../$OUTDIR/index.js
done

# Cleanup
cd ..
rm -r tmp

# Add package.json
sed s:build/index.js:index.js:g package.json > build/package.json
cp package-lock.json build

true

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 2022-01-17
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    相关资源
    最近更新 更多