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语句。步骤很简单:
- 安装
@microsoft/signalr后,找到它的全局脚本(一般在node_modules/@microsoft/signalr/dist/browser/signalr.js) - 把这个文件复制到项目的
wwwroot/lib/signalr目录下 - 在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
相关产品推荐
相关产品推荐

