Visual Studio [不是代码] 2019 中带有 TypeScript 和 Node(或 ESM)模块的 ASP.NET 5(核心)网站?

Posted

技术标签:

【中文标题】Visual Studio [不是代码] 2019 中带有 TypeScript 和 Node(或 ESM)模块的 ASP.NET 5(核心)网站?【英文标题】:ASP.NET 5 (Core) Website with TypeScript and Node (or ESM) modules in Visual Studio [not Code] 2019? 【发布时间】:2021-09-27 04:06:59 【问题描述】:

所以我跟随this guide 在 ASP.NET 5 网站项目(使用 Razor 页面)中设置 TypeScript。我想用 Node 模块输入 TypeScript,而不是仅仅导入为 any

现在我想添加一个 Node 模块,比如 EthersJS,所以我有:

    "dependencies": 
        "ethers": "^5.4.1"
    

这段代码无法编译:

import  ethers  from "ethers";

export class EthService 

    pro: ethers.providers.BaseProvider;

    constructor() 
        const pro = this.pro = new ethers.providers.WebSocketProvider("");
    

    async getBlockNumberAsync() 
        return await this.pro.getBlockNumber();
    


除非我将"moduleResolution": "Node" 添加到tsconfig.json。显然这实际上不会在浏览器中运行。

我应该如何设置它以便以某种方式编译 Node 模块?如果我能做到以下任何一个,我认为问题可以解决:

使 TypeScript/Gulp/MSBuild 更改 import ethers from "ethers"; 为正确的路径(我可以将编译后的 lib 文件手动复制到 wwwroot 中)。

手动将导入路径设置为 import ethers from "path/to/compiled/ethers.js";,但我需要以某种方式告诉 TypeScript ethers 输入来自 ethers Node 模块。

更新:我认为第三种可能性也非常好,如果我可以像这样声明导入(我只会将 ESM 文件添加到全局范围中):

declare import  ethers  from "ethers";

以上选项是否可行?或者有什么办法吗?谢谢。

注意:我知道有Triple-Slash Directives,它可能会解决我的问题,但我还不明白他们在做什么。

当前gulpfile.js

/// <binding AfterBuild='default' Clean='clean' />
/*
This file is the main entry point for defining Gulp tasks and using Gulp plugins.
Click here to learn more. http://go.microsoft.com/fwlink/?LinkId=518007
*/
var gulp = require("gulp");
var del = require("del");
var paths = 
    scripts: ["Scripts/**/*.js", "Scripts/**/*.ts", "Scripts/**/*.map"],
;
gulp.task("clean", function () 
    return del(["wwwroot/Scripts/**/*"]);
);
gulp.task("default", function () 
    gulp.src(paths.scripts).pipe(gulp.dest("wwwroot/Scripts"));
);

tsconfig.json:


    "compilerOptions": 
        "noImplicitAny": true,
        "noEmitOnError": true,
        "removeComments": false,
        "sourceMap": true,
        "target": "ESNext",
        "module": "ESNext",
        "moduleResolution": "Node"
    ,
    "exclude": [
        "wwwroot",
        "node_modules"
    ],
    "compileOnSave": true

【问题讨论】:

【参考方案1】:

我可以通过使用独立的 ethers.js 脚本文件将 ethers 命名空间暴露给全局范围来解决问题:

<script defer src="/libs/ethers.umd.min.js" asp-append-version="true"></script>

现在你需要告诉 TypeScript 在全局范围内有一个ethers“事物”(命名空间/模块)。感谢this article,我找到了解决方案。创建一个.d.ts 文件(任何都可以,我将其命名为globals.d.ts):

import  ethers as eth  from "ethers";

declare global 

    // @ts-ignore: export typing
    export  eth as ethers ;


现在您可以在任何地方使用ethers,而无需任何声明。例如我的整个EthService.ts 文件:

export class EthService 

    pro: ethers.providers.WebSocketProvider;

    init(server: string) 
        this.pro = new ethers.providers.WebSocketProvider(server);
    

    async getBlockNoAsync() 
        return await this.pro.getBlockNumber();
    


【讨论】:

以上是关于Visual Studio [不是代码] 2019 中带有 TypeScript 和 Node(或 ESM)模块的 ASP.NET 5(核心)网站?的主要内容,如果未能解决你的问题,请参考以下文章

托管代码的调试器(不是 Visual Studio)

Visual Studio 是不是使用 nvcc 编译 cuda 代码?

Visual Studio 2012-2019的130多个jQuery代码片段。

Visual Studio 2019“附加”而不是“开始”问题

Visual Studio 2019 STL 包含错误

Visual Studio 2019 未运行其他 .cpp 文件