【问题标题】:How to run TypeScript files from command line?如何从命令行运行 TypeScript 文件?
【发布时间】:2016-02-05 18:36:31
【问题描述】:

我很难找到答案。使用普通的 Node.JS,您可以使用 node path/to/file.js 运行任何 js 文件,使用 CoffeeScript 时,它是 coffee hello.coffee,而 ES6 是 babel-node hello.js。我如何对 Typescript 做同样的事情?

我的项目有一个tsconfig.json,Webpack/ts-loader 使用它来为浏览器构建一个漂亮的小包。不过,在此之前我需要从控制台运行构建步骤,这将使用项目中使用的一些 .ts 文件来生成模式,但我似乎无法运行单个 Typescript文件而不编译整个项目。

【问题讨论】:

    标签: node.js typescript


    【解决方案1】:

    我如何使用 Typescript 做同样的事情

    您可以使用tsc -w -p .tsc 在监视模式下运行,它会以实时方式为您生成.js 文件,因此您可以像平常一样运行node foo.js

    TS 节点

    有 ts-node : https://github.com/TypeStrong/ts-node 可以即时编译代码并通过节点运行它?

    npx ts-node src/foo.ts
    

    【讨论】:

    • tsc 将 js 写入磁盘。 ts-node 不需要这样做,并且可以即时运行 ts
    • 只是提醒 ts-node 不会从导入的模块中控制台日志。例如:如果您是 ts-node fil1.ts 并且 file1.ts 在内部使用 file2.ts,则不会记录来自 file2.ts 的控制台日志。
    • ts 节点 FTW。 npm install -g ts-nodets-node your-script.ts 变得轻而易举。
    • deno发布以来,您现在可以执行deno run path/to/file.ts,它将在单个命令中运行打字稿文件,而无需将其编译为单独的JS文件。
    【解决方案2】:

    这个问题是在 2015 年发布的。在 2018 年,node 可以识别 .js.ts。因此,运行 node file.ts 也会运行。

    【讨论】:

    • Node 将任何文件解释为 javascript,因此只有当相关的打字稿文件本身是有效的 javascript 文件时,它才会起作用。
    • 如果文件内容是有效的 javascript 但扩展名是 ts,这将起作用。 Node 不关心扩展名是什么,只要内容是有效的 javascript。
    【解决方案3】:

    我们有以下步骤:

    1. 首先你需要安装打字稿

      npm install -g typescript
      
    2. 创建一个文件 helloworld.ts

      function hello(person){
         return "Hello, " + person;
      }
      let user = "Aamod Tiwari";
      const result = hello(user);
      console.log("Result", result)
      
    3. 打开命令提示符并输入以下命令

      tsc helloworld.ts
      
    4. 再次运行命令

      node helloworld.js
      
    5. 结果将显示在控制台上

    【讨论】:

    • 在您的情况下,我们运行 .js 文件而不是 .ts 文件。
    【解决方案4】:

    以防万一有人像我一样疯了,只想像运行 .js 脚本一样运行 typescript 脚本,你可以试试这个。我编写了一个 hacky 脚本,似乎使用节点执行 .ts 脚本。

    #!/usr/bin/env bash
    
    NODEPATH="$HOME/.nvm/versions/node/v8.11.3/bin" # set path to your node/tsc
    
    export TSC="$NODEPATH/tsc"
    export NODE="$NODEPATH/node"
    
    TSCFILE=$1 # only parameter is the name of the ts file you created.
    
    function show_usage() {
        echo "ts2node [ts file]"
        exit 0
    }
    
    if [ "$TSCFILE" == "" ]
    then
        show_usage;
    fi
    
    JSFILE="$(echo $TSCFILE|cut -d"." -f 1).js"
    
    $TSC $TSCFILE && $NODE $JSFILE
    

    您可以这样做或自己编写,但本质上,它会创建 .js 文件,然后使用 node 来运行它,如下所示:

    # tsrun myscript.ts
    

    简单。只要确保你的脚本只有一个“。”否则,您需要以不同于我所展示的方式更改您的 JSFILE。

    【讨论】:

      【解决方案5】:

      只是有用的信息 - 这是最新的 TypeScript / JavaScript 运行时Deno

      它是由节点 Ryan Dahl 的创建者创建的,基于如果他可以重新开始,他会做不同的事情。

      【讨论】:

      • 这是一个例子:deno run https://deno.land/std/examples/welcome.ts
      • 这将是我的首选方法,除了节点模块的 import/require 问题,这是非常重要的修复
      • 随着工具的增长以支持 Deno 的安全性,我看到它的易用性在增加。包括导入需要如何具有完整的相对路径/url 和文件扩展名。 Deno is secure by default. Therefore, unless you specifically enable it, a deno module has no file, network, or environment access for example. 在开发时添加额外的标志。然后将其锁定:deno run --unstable --allow-read --allow-env main.ts -> dev.to/mxfellner/…
      【解决方案6】:

      要添加到上面的@Aamod 答案,如果您想使用一个命令行来编译和运行您的代码,您可以使用以下内容:

      窗户:

      tsc main.ts | node main.js
      

      Linux / macOS:

      tsc main.ts && node main.js
      

      【讨论】:

      • npm install typescript -g 安装tsc CLI
      • 啊窗户'管道'
      • 如果你想逐行调试 typescript 源代码,这是行不通的。
      【解决方案7】:

      为自己编写一个简单的 bash 包装器可能会有所帮助。

      #!/bin/bash
      npx tsc $1 && node ${1%%.ts}
      

      【讨论】:

        【解决方案8】:

        运行以下命令并全局安装所需的包:

        npm install -g ts-node typescript '@types/node'
        

        现在运行以下命令来执行一个打字稿文件:

        ts-node typescript-file.ts
        

        【讨论】:

        • 这是最好的方法,恕我直言,ts-node 也提供 TypeScript REPL。
        • 如果您不想使用全球版本,也可以依赖npx ts-node yourscript.ts
        • 对下载的查询不再有效,试试npm install typescript --save-dev --global && npm i ts-node -g
        【解决方案9】:

        Zeeshan Ahmad's answer,我也认为ts-node 是要走的路。我还会添加一个 shebang 并使其可执行,因此您可以直接运行它。

        1. 全局安装 typescript 和 ts-node:

          npm install -g ts-node typescript
          

          yarn global add ts-node typescript
          
        2. 使用此内容创建一个文件hello

          #!/usr/bin/env ts-node-script
          
          import * as os from 'os'
          
          function hello(name: string) {
              return 'Hello, ' + name
          }
          const user = os.userInfo().username
          console.log(`Result: ${hello(user)}`)
          

          如你所见,第一行有 ts-node 的 shebang

        3. 只执行文件直接运行

          $ ./hello
          Result: Hello, root
          

        一些注意事项:


        2020 年 4 月 6 日更新:在 cmets 中大量输入后的一些更改:更新 shebang 以使用 ts-node-script 而不是 ts-node,链接到 ts-node 中的问题。

        【讨论】:

        • 这种方法可能会遇到很多问题。我在this issue 中记录了潜在的解决方案。特别是,shebang #!/usr/bin/env ts-node-script(也是ts-node 的一部分)似乎更适合此目的。如果你想链接你的脚本(例如使用npm link),事情会变得更加复杂,因为ts-node 的脚本模式(还没有?)遵循符号链接。在我的情况下,我最终选择了#!/usr/bin/env -S ts-node --project /usr/local/lib/node_modules/<your-project>/tsconfig.json
        【解决方案10】:

        其他答案都没有讨论如何运行使用模块的 TypeScript 脚本,尤其是现代 ES 模块。

        首先,ts-node doesn't work 在这种情况下,截至 2020 年 3 月。所以我们将满足于 tsc,然后是 node

        第二,TypeScript still can't output .mjs files。所以我们将满足于.js 文件和"type": "module" 中的package.json

        第三,您想要干净的 import 行,而不指定 .js 扩展名(这会在 .ts 文件中造成混淆):

        import { Lib } from './Lib';
        

        嗯,这很重要。节点需要在导入时指定扩展,除非您使用experimental-specifier-resolution=node 标志。在这种情况下,当您仅在 import 行上指定 ./Lib 时,它将使 Node 能够查找 Lib.jsLib/index.js

        第四,还有一个障碍:if you have a different main filename than index.js in your package, Node won't find it

        转译比运行普通 Node 更麻烦。

        这里是a sample repo with a modern TypeScript project structure,生成ES Module代码。

        【讨论】:

        • 非常感谢,这几乎就是我今天尝试这样做时遇到的一系列问题!
        • 您可以使用npmjs.com/package/@digitak/esrun 解决上述问题
        • 谢谢@GinQuin! esrun 完全符合我对 ts-node 的预期:只需使用导入运行脚本。
        【解决方案11】:
        1. 全局安装ts-node节点模块。
        2. 创建节点运行时配置(用于IDE)或在命令行中使用node在文件js文件下运行(该路径适用于windows,但您也可以为linux执行此操作) ~\AppData\Roaming\npm\node_modules\ts-node\dist\bin.js
        3. 将您的 ts 文件路径作为命令行参数。
        4. 随心所欲地运行或调试。

        【讨论】:

        • 如果您想使用 IDE 进行调试,您需要这样做!谢谢你!
        【解决方案12】:

        对于Webstorm等无法将node命令更改为ts-nodenpx的环境:

        1. npm install ts-node typescript(安装依赖)
        2. node --require ts-node/register src/foo.ts(在“节点参数”中添加--require ts-node/register

        【讨论】:

        • 可以更改 WebStorm 中的 Node 解释器。在运行/调试配置中,您可以选择任何您想要的二进制文件作为节点解释器。
        【解决方案13】:

        这个答案可能为时过早,但deno 支持开箱即用地运行 TS 和 JS。

        根据您的开发环境,迁移到 Deno(并了解它)可能太多了,但希望这个答案对未来的人有所帮助。

        【讨论】:

        【解决方案14】:

        还有一个选项可以直接从 CLI 运行代码,而不是 *.ts 文件本身。

        完美描述in the ts-node manual

        1. 第一步,通过 npm、yarn 或任何你喜欢的方式全局安装 ts-node
        2. ...现在只需使用 ts-node -e 'console.log("Hello, world!")'您还可以添加 -p 标志以打印代码

        这个小命令非常适合检查,是否一切安装正常。并用于查找与 tsconfig.json 选项相关的其他错误。

        【讨论】:

          【解决方案15】:

          您可以使用@digitak/esrun 库,它是esbuild 的薄包装,几乎可以立即执行打字稿文件。

          我是图书馆的作者。

          我创建它是因为我对 ts-node 感到失望:太慢了,而且大多数时候它都不起作用。

          esrun 相对于ts-node 的优势:

          • 非常快(使用esbuild),
          • 可以导入 ESM 以及 CJS(只需使用您选择的库,它就可以开箱即用),
          • 有一个包含的监视模式,使用“--watch”选项运行您的脚本,对您的入口文件或其任何依赖项的任何更改都将重新触发结果,
          • 您可以在检查模式下使用它来使用 DevTools 控制台而不是终端控制台。

          【讨论】:

          • 天哪,正是我一直在寻找的东西,很多小时!无法让ts-node 工作。只需运行“esrun my-file.ts”,开箱即用!
          • 也许有点免责声明你是图书馆的作者?
          • @RobinMétral 是的,我有时觉得免责声明很荒谬。我不是为了自己的宣传而发布此消息,而是为了真正帮助与我有相同需求的人。 ts-node 是麻烦和缓慢,我想要一个现代的打字稿跑步者。我还认为这不是我真正的工作,因为我只是围绕 Evan W 的出色 EsBuild 库编写了一个小包装 - 他是值得所有功劳的人。
          • 哦,谢谢@RobinMétral 的链接,不知道这是强制性的。我会更新我的答案。这个库只不过是一个围绕 Esbuild 的 77 行代码包装器,不需要 7 个协作者团队或 77 行代码的扩展测试套件。所有工作均由 Esbuild 完成。人们可以使用它或 ts-node 或 sucrase-node 或任何他们喜欢的东西。我个人更喜欢我的图书馆,因为我遇到的问题更少。 Estrella 看起来很棒,但对于这个问题我不推荐它(也不推荐 Esbuild),因为它们都是构建工具而不是运行工具。
          • 我不知道为什么没有指定这个,但是如果需要的话,可以(很容易地)使用这个做npx @digitak/esrun index.ts替换index.ts
          【解决方案16】:

          对于 linux / mac,您可以添加 ts-node-script shebang。

          全局安装 typescript / ts-node(非全局安装见下文1):

          npm install ts-node typescript --save-dev --global
          

          将此添加为.ts 文件的第一行:

          #!/usr/bin/env ts-node-script
          

          然后使文件可执行:

          $ chmod +x ./your-file.ts
          

          然后您可以直接从命令行运行该文件:

          $ ./your-file.ts
          

          注意事项:

          1 对于非全局安装,您可以将本地安装到您的项目中

          npm install ts-node typescript --save-dev
          

          并添加shebang脚本的相对路径,例如:

          #!/usr/bin/env ./node_modules/.bin/ts-node-script
          

          2Support for shebangs正式加入ts-node v8.9.0

          【讨论】:

            猜你喜欢
            • 2015-08-13
            • 2020-06-05
            • 1970-01-01
            • 2018-10-13
            • 2013-07-06
            • 1970-01-01
            • 1970-01-01
            • 2018-07-27
            相关资源
            最近更新 更多