Intern 4迁移测试失败:Dojo2 loader加载路径错误求助
问题背景
我正从Intern 3/RequireJS迁移至Intern 4/Dojo2,执行测试时,完成能力检查后在加载测试前就失败,报错信息如下:
Listening on localhost:9000 (ws 9001) Tunnel started …Created remote session chrome 66.0.3359.139 on XP (bc531663-f9f7-4cba-9038-6ab15808e9a0) Suite chrome 66.0.3359.139 on XP FAILED Error: Unable to load /..\node_modules\intern/loaders/dojo2.js at HTMLScriptElement.<anonymous> <node_modules\intern\browser\remote.js:667:23264> TOTAL: tested 1 platforms, 0 passed, 0 failed; suite error occurred
从http://localhost:9000/__intern/browser/remote.html请求该文件时出现404,看起来是dojo2.js的路径错误。若将配置中的“dojo2”替换为“__intern/loaders/dojo2.js”,则会出现/node_modules/@dojo/loader/loader.js的404错误。似乎是路径指向错误,请问该如何修复?
附intern.json配置:
{ "loader": { "script": "dojo2", "config": { "waitSeconds": 60, "packages": [ { "name": "objects", "location": "objects" }, { "name": "edits", "location": "./", "main": "edits" }, { "name": "prepare", "location": "TESTS", "main": "prepare" }, { "name": "common", "location": "./", "main": "common" }, { "name": "socket", "location": "http://localhost:2020/socket.io", "main": "socket.io" } ] } }, "suites": [ "./functional/InitTests.js" ], "environments": [ { "browserName": "chrome" } ], "tunnelOptions": { "drivers": [ "chrome" ], "port": 4444, "version": "3.4.0", "maxConcurrency": 1, "runnerClientReporter": { "writeHtml": false } }, "tunnel": "null", "leaveRemoteOpen": true, "grep": "" }
解决方案
这个问题本质是Intern 4的loader路径解析逻辑和Intern 3不同,加上Windows系统下路径分隔符(\和/)混合导致的解析错误,你可以按以下步骤修复:
修正loader的script配置
不要直接写dojo2或者完整的相对路径,改用Intern提供的模块标识符来指定loader。Intern 4中dojo2 loader的正确标识符是intern/loaders/dojo2,修改loader.script的值:"loader": { "script": "intern/loaders/dojo2", // 其他配置保持不变 }这样Intern会自己处理路径解析,避免手动写路径带来的分隔符问题。
配置loader的package映射,解决@dojo/loader的404问题
当使用dojo2 loader时,它需要正确找到@dojo/loader包。你需要在loader的config.packages里添加@dojo/loader的映射:"loader": { "script": "intern/loaders/dojo2", "config": { "waitSeconds": 60, "packages": [ // 你的其他package配置 { "name": "@dojo/loader", "location": "node_modules/@dojo/loader", "main": "loader" } ] } }这个配置告诉dojo2 loader去哪里找它的核心loader文件。
确保路径分隔符统一(Windows环境特别注意)
把配置里所有路径的分隔符都改成/,比如"./"保持不变,"TESTS"没问题,避免出现..\这种Windows风格的分隔符,Intern在浏览器环境下会用Unix风格的分隔符解析路径。验证配置生效
重新启动Intern测试服务,现在请求/__intern/loaders/dojo2.js应该能正确加载,同时@dojo/loader/loader.js也会通过你配置的package路径找到对应的文件。
额外提示
如果还是出现路径问题,可以检查一下你的项目目录结构,确保node_modules/@dojo/loader确实存在,没有安装失败的情况。如果是yarn或者npm的版本问题,尝试重新安装依赖:
rm -rf node_modules package-lock.json npm install
内容的提问来源于stack exchange,提问作者sheodox

