如何在 Web 应用程序(ASP.NET Core)中使用 TypeScript 导入语句而不是 <reference path...>?

Posted

技术标签:

【中文标题】如何在 Web 应用程序(ASP.NET Core)中使用 TypeScript 导入语句而不是 <reference path...>?【英文标题】:How to use TypeScript import statement instead of <reference path...> in a Web application (ASP.NET Core)? 【发布时间】:2021-11-21 09:02:13 【问题描述】:

上下文

我的 Web 应用程序 (ASP.NET Core) 中有一个工作版本的打字稿 Hello World 通过 NuGet 包 "Microsoft.TypeScript.MSBuild" Version="4.4.2"tsconfig.json 使用 typscript 编译器。 (见下文) 我想使用 3rd 方库,并通过 packages.json 成功添加 "@types/lodash": "^4.14.175"(见下文) 我添加了/// &lt;reference path="../node_modules/@types/lodash/index.d.ts"/&gt;(见下文) 一切正常,但 /// &lt;reference path="..." 行带有绿色下划线,ESLint 显示

不要对 index.d.ts 使用三斜杠引用,而是使用 import。

好的,我稍后会使用导出/导入,所以我编辑了三斜杠参考线作为注释,并添加了import * as _ from "lodash" 行,它编译得很好,但是在 chrome 中运行时 导致运行时错误:

不能在模块外使用 import 语句

所以我将&lt;script tag 更改为以下内容:&lt;script type="module" src="~/js/app.js"&gt;&lt;/script&gt;

但是这会导致以下 chrome 运行时错误

无法解析模块说明符“lodash”。相对引用必须以“/”、“./”或“../”开头。

问题

现在我被困住了,由于我的知识非常有限,我猜想缺少一些步骤/转换,但是什么?我试图在我的 .ts 文件的导入语句中包含一些路径(导致编译错误)。编译时我想用工作中的import 指的是@typings,但是运行时lodash.js 是来自cdn,两者没有任何关系...

app.ts

// commented out /  <reference path="../node_modules/@types/lodash/index.d.ts"/>
import * as _ from "lodash"
console.log(_.camelCase("Hello"));

发出的 app.js

// commented out /  <reference path="../node_modules/@types/lodash/index.d.ts"/>
import * as _ from "lodash"; 
console.log(_.camelCase("Hello"));
//# sourceMappingURL=app.js.map

index.html

<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script type="module" src="~/js/app.js"></script>

tsconfig.json


  "compileOnSave": true,
  "compilerOptions": 
    "noImplicitAny": false,
    "noEmitOnError": true,
    "removeComments": false,
    "sourceMap": true,
    "target": "es6",
    "module": "ES6",
    "outDir": "wwwroot/js"
  ,
  "exclude": [
    "node_modules",
    "wwwroot"
  ]

packages.json


  "version": "1.0.0",
  "name": "asp.net",
  "private": true,
  "devDependencies": 
    "@types/lodash": "^4.14.175"
  

【问题讨论】:

【参考方案1】:

尝试修改tsconfig.json

// tsconfig.json

  ...
  @types: ["node_modules/"] // or typings

或者使用 ES5 require

const _ = require("lodash");

找到以下可能的解决方案

需要将所需文件复制到 wwwroot 文件夹,以便在应用程序运行时访问它们。

为此,您需要使用捆绑器将文件捆绑在一起(应该在默认的 ASP.NET Core 项目模板中)或使用 Gulp 或 Grunt 等任务运行器在构建/发布时运行任务,这样做为你。请参阅有关 Gulp 示例的 ASP.NET Core 文档。

原答案:https://***.com/a/43513137/13747848

注意: 请注明原答辩人!


编辑

对于错误

未捕获的类型错误:无法解析模块说明符“lodash”。相对引用必须以“/”、“./”或“../”开头。

截至 2021 年,请考虑Márton Salomváry(2018 年 1 月)的以下声明:

不幸的是,即使大多数以 ES6 模块格式编写或发布的库也无法工作,因为它们以转译器为目标并依赖于 Node.js 生态系统。为什么这是个问题? 使用 import _ from 'lodash' 之类的裸模块路径目前无效,浏览器不知道如何处理它们。

还有Jake Archibald(2017 年 5 月)的声明:

目前不支持“Bare”导入说明符。

有效的模块说明符必须匹配以下之一:

    完整的非相对 URL。 以 / 开头。 以./.开头 以 ../. 开头

还有javascript.info:

在浏览器中,import 必须获取相对 URL 或绝对 URL。没有任何路径的模块称为“裸”模块。 不允许导入此类模块。

某些环境,如 Node.js 或捆绑工具允许裸模块,没有任何路径,因为它们有自己的方式来查找模块和挂钩来微调它们。 但浏览器还不支持裸模块。

Bundlers 促进了浏览器尚不支持的“Bare Imports”的使用。除非您捆绑您的代码,否则我建议使用 @Asler 提出的解决方案。另外,目前正在做大量工作来研究“Bare Imports”在浏览器中的实现,如果您想监控整体进度,请关注link。

原答案:https://***.com/a/66484496/13747848

注意: 请注明原答辩人!


如果您不希望使用任何捆绑工具,则需要提供 node_modules 中的 lodash 文件夹的路径,相对于您有 import 语句的 javascript 文件。

如果您不想使用捆绑器,也值得从特定文件导入您需要的功能。例如:

import _each from '../node_modules/lodash/each'

原答案:https://***.com/a/52558858/13747848

注意: 请注明原答辩人!

【讨论】:

非常感谢。 1) 关于引用的原始答案:我通过 NuGet 使用 javascript 文件。我正在通过 npm 使用。 chrome中的错误也不是404,而是关于模块的。该文件在 CDN 中可用,这不是问题。 2)关于tsconfig中的@types:编译器成功找到了类型,所以这不是问题。 3)关于 ES5:我想在 ES6 中使用 import/export,不想在 ES5 中使用 require 添加了更多信息,如果有用请告诉我 ...在发布我的问题之前,我已经阅读了该内容。那里接受的答案是包容性的,请在那里阅读它的 cmets:最后的状态,OP 出错了。从接受的答案中直接复制到此处“我尝试使用您的建议来导入 lodash,但这给了我以下错误:“SyntaxError: The requested module '../node_modules/lodash/lodash.js' does not provide an export named 'default '" 这正是我的问题,请阅读我的 OP True.. 没有注意这一点,因为它被接受了。 Welp ..我试过了:((如果我发现了什么,我会更新我的答案 可能不是您要找的答案,但可能有用:dmnsgn.medium.com/…

以上是关于如何在 Web 应用程序(ASP.NET Core)中使用 TypeScript 导入语句而不是 <reference path...>?的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core Web API 应用程序:如何更改监听地址?

ASP.NET Core Web 应用程序系列- 在ASP.NET Core中使用AutoMapper进行实体映射

如何使用 Microsoft 身份平台身份验证在 ASP.NET Core Web 应用程序中获取 JWT 令牌?

如何在 ASP .NET Core Web 应用程序中向 apsettings.js 添加“密钥”及其“名称”

如何在 Web 应用程序(ASP.NET Core)中使用 TypeScript 导入语句而不是 <reference path...>?

我应该如何保护我的 Web 应用程序(ASP.Net Core 3.1 MVC)?