You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET 6项目中TypeScript import语句运行时触发“Uncaught SyntaxError: Cannot use import statement outside a module”错误

ASP.NET 6项目中TypeScript import语句运行时触发“Uncaught SyntaxError: Cannot use import statement outside a module”错误

嘿,我太懂你现在的困境了——不用打包工具,单独编译每个TypeScript文件到JS后在浏览器里跑,确实会栽在这个import语句的问题上。毕竟默认情况下,浏览器会把普通脚本当成非模块处理,根本认不出import语法。下面给你几个实用的解决办法,你可以根据项目情况挑:

方法一:给脚本标签加上模块标识

当你在CSHTML里引用编译好的JS文件时,给<script>标签加上type="module"属性,告诉浏览器这是个ES模块,这样它就能正确解析import语句了:

<script src="~/js/SignalR.js" type="module"></script>

需要注意的是,这种方式下所有依赖的脚本也得是模块形式,而且你得确保@microsoft/signalr的文件路径是对的——可以把signalr的JS文件放到项目的静态资源目录(比如wwwroot/lib/signalr),然后在TS里用相对路径导入,或者配置TS的路径映射来搞定。

方法二:修改TS配置,编译成非模块格式

调整你的tsconfig.json,把module选项改成UMD或者IIFE,这样TypeScript会把代码编译成自执行函数或者通用模块定义,不会保留import语句,而是把依赖打包到同一个文件里。举个例子:

{
  "compilerOptions": {
    "module": "UMD",
    "target": "ES5", // 也可以根据需求换成更高版本
    "outDir": "./wwwroot/js",
    // 其他原有配置...
  }
}

记得要先确保@microsoft/signalr已经正确安装到项目里,编译后的JS文件就能直接用普通<script>标签引用,不用加额外属性了。

方法三:改用SignalR的全局脚本

要是上面两种方式都不合你心意,那就直接用SignalR的全局版本脚本,彻底不用写import语句。步骤很简单:

  1. 安装@microsoft/signalr后,找到它的全局脚本(一般在node_modules/@microsoft/signalr/dist/browser/signalr.js)
  2. 把这个文件复制到项目的wwwroot/lib/signalr目录下
  3. 在CSHTML里先引用这个全局脚本,再引用你的TS编译后的JS:
<script src="~/lib/signalr/signalr.js"></script>
<script src="~/js/SignalR.js"></script>

然后在你的TS文件里,直接用全局的signalR对象就行:

export namespace SignalRNameSpace{
    export class SignalR{
        // 直接使用全局signalR对象
        connection = new signalR.HubConnectionBuilder()
            .withUrl("/chatHub")
            .build();
        // ...其他业务代码
    }
}

这种方式最省心,不用折腾模块配置,适合不想改太多原有架构的场景。

备注:内容来源于stack exchange,提问作者omo_codes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 08:29:51