RequireJS搭配TypeScript运行报exports未定义等错误排查
问题根因&修复方案
你踩的全是写代码时很容易看漏的低级书写/配置错误,根本不是什么复杂的配置兼容问题:
- 路径完全对不上
你自己列的项目根目录下只有functions/文件夹,根本没有src/这个目录,但test.ts里的导入路径写的是./src/functions,连你自己描述文件位置都写混了,一会儿说文件在functions/functions.ts一会儿说在src/functions.ts。要么把放functions.ts的文件夹改名叫src,要么把导入路径改成./functions/functions,保证编译后的js文件路径和导入规则能匹配上。 - script标签写了语法错误,导致requireJS直接失效
你引入require.js的标签里,src="lib/require.js"后面多了个完全多余的逗号:
HTML标签属性之间不需要加逗号分隔,这个多余的符号会让浏览器直接忽略后面的<!-- 错误代码 --> <script src="lib/require.js", data-main="test"></script>data-main="test"属性,requireJS拿不到入口文件配置,根本不会按AMD规范走依赖加载流程。你之前加var exports = {}的hack之后报的模块上下文错误,本质就是加载链路从根上就错了。把这个逗号删掉就行。 - TypeScript编译配置不全,残留旧编译产物
你现在的tsconfig.json只写了基础编译选项,没指定要编译的文件范围,也没配置输出路径。最开始报exports is not defined的核心原因,大概率是你之前把module配置成CommonJS的时候编译过一版js文件,产物里带CommonJS特有的exports全局变量调用,浏览器环境根本没有这个变量,自然报错。
改完的tsconfig可以参考这个:
改完配置先把目录里之前残留的所有.js编译产物全删了,重新执行{ "compilerOptions": { "target": "es6", "module": "amd", "moduleResolution": "node", "esModuleInterop": true, "outDir": "./" }, "include": ["./*.ts", "./src/**/*.ts"], "resolveJsonModule": true }tsc命令把ts编译成AMD规范的js文件,再打开页面就能正常运行。 - 额外提个小问题:你列的目录里
node-modules文件夹名写错了,Node.js的依赖目录正确名称是node_modules(是下划线不是中划线),现在你只装了typescript不影响运行,后面装第三方依赖肯定出问题,顺手改了就行。
别瞎加
var exports = {}这种补丁式hack,只会破坏AMD模块的加载上下文,半毛钱用都没有。
内容的提问来源于stack exchange,提问作者pgolbus
相关产品推荐
相关产品推荐

