Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将TypeScript代码编译成一个.js文件,可通过";节点mycode.js“;?_Javascript_Node.js_Typescript - Fatal编程技术网

Javascript 如何将TypeScript代码编译成一个.js文件,可通过";节点mycode.js“;?

Javascript 如何将TypeScript代码编译成一个.js文件,可通过";节点mycode.js“;?,javascript,node.js,typescript,Javascript,Node.js,Typescript,我希望能够做到这一点,而无需网页包装、吞咽等,只需“tsc[args]mycode.ts”。这可能吗 在my package.json中,我有一个如下的构建命令: "build:mycode": "tsc --allowSyntheticDefaultImports --lib es2018 --lib dom -m amd -t es2018 --moduleResolution node --outFile ./mycode.js ./mycode.ts

我希望能够做到这一点,而无需网页包装、吞咽等,只需“tsc[args]mycode.ts”。这可能吗

在my 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
和网页包等。)

我尝试使用
-m commonjs
,但是
-outFile
不允许这样做,只能使用
amd
系统

问题在于,以这种方式生成的代码在被
节点调用时会产生此错误:

ReferenceError: define is not defined
我不知道如何定义
define
节点
命令是否有提供必要定义的参数?到目前为止,我在谷歌搜索到的所有东西都会调用额外的工具,如果可能的话,我宁愿避免使用这些工具,或者是针对web浏览器,而不是创建命令行工具


注意:任何涉及
标记的解决方案都不适用。

不可能使用
tsc
--outFile
参数将CommonJS模块连接到单个文件。请参阅以进行讨论

为了实现您的目标,您需要使用捆绑工具(例如网页包)


原始答复:

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

tsc\
--allowSyntheticDefaultImports\
--lib es2018,dom\
--模块commonjs\
--目标es2018\
--模块解决方案节点\
./script.ts

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

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

#!/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

这样做,您就可以提供自己的TSConfig作为argument@jsejcksn不幸的是,它看起来像是输出单文件模块,而不是可执行文件,而且看起来是面向web的。如果不是捆绑包,“单个文件”是什么意思?另外,我不知道你所说的“面向网络”是什么意思。Deno只是捆绑ECMAScript模块(可选IIFE格式)。任何与环境相关的配置(全局变量,如
窗口
等)都取决于您的TSConfig。通过“面向web”,我看到文档中的代码与
标记一起使用,并且捆绑方式也使包中的任何内容都不会自动执行,它只提供可以调用的定义。我希望“node mycode.js”能够立即执行代码,而不仅仅是返回一个我可以调用的函数来执行代码。我现在理解了您的担忧。我认为现在是研究ES模块的好时机。我已经试过了。该文件导入了我的另外两个文件,如果没有
--outFile
,我将得到三个生成的.js文件,而不仅仅是一个。@kshetline感谢您的澄清;我已经更新了我的答案。@kshetline您尚未分享有关项目的任何详细信息/要求,但CLI脚本正是Deno所要解决的,因此它非常适合您的用例。以下是手册中的一个示例: