1

我有一个使用中编写的应用程序层。我也有使用构建的 Web 资源。Web 资源的 html 使用在必要时包含已编译的 Typescript 代码。我看到的问题是我在 Typescript 中使用的相对路径。当我将 Web 资源发布到 Microsoft Dynamics 时,RequireJS 正在尝试从我的 Typescript 加载相对于 html 文件而不是相对于转译的 Javascript 文件的相对路径。

网络API

转译为 build/CCSEQ/WebAPI.js(Model.js 位于 build/CCSEQ/Model.js)

"use strict";

import * as Model from "./Model.js";

export class WebAPI{
  // Code here
}

主.html

位于 /WebResources/html/Main.html

<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>Main</title>   
</head>
<body>
    <script src="require.js" data-main="../js/Main.js"></script>
</body>
</html>

主.js

位于 /WebResources/js/Main.js

"use strict";

// Require fails because it is looking for /WebResources/html/Model.js rather than /build/CCSEQ/Model.js
require(["WebAPI.js"], function(WebApi){
  // Code Here
});
4

1 回答 1

0

你应该做的第一件事是.js从你的模块名称中删除(你的require调用和你的import声明)。您传入的名称requiredefine模块名称。它们看起来像路径,但它们不是真正的路径。RequireJS 获取模块名称并使用map,pathsbaseUrl配置选项将它们转换为路径(以命名最常用的那些)。当您不使用这些选项时,它会使用合理的默认值。

如果您确实.js模块名称中使用,RequireJS 假定您传递的是路径而不是实际的模块名称。(如果您以斜杠开头字符串,使用类似 in ( foo?blah) 的查询参数,或者如果您在字符串中有冒号,RequireJS 将其视为您正在使用协议(例如)的指示,则同样如此http://。)在这种情况下,没有将模块名称转换为路径 so mappaths并且baseUrl都被忽​​略了。这是一段代码

        //If a colon is in the URL, it indicates a protocol is used and it is just
        //an URL to a file, or if it starts with a slash, contains a query arg (i.e. ?)
        //or ends with .js, then assume the user meant to use an url and not a module id.
        //The slash is important for protocol-less URLs as well as full paths.
        if (req.jsExtRegExp.test(moduleName)) {
            //Just a plain path, not module name lookup, so just return it.
            //Add extension if it is included. This is a bit wonky, only non-.js things pass
            //an extension, this method probably needs to be reworked.
            url = moduleName + (ext || '');
        } else {

req.jsExtRegExp值为/^\/|:|\?|\.js$/

(您可以保留您.js传递给的值,data-main因为data-main它很特殊。)

此外,您需要做一些事情来require(["WebAPI"]...解决正确的路径。您可以通过baseUrl在 RequireJS 配置中设置一个指向包含该文件的目录来完成此操作WebAPI.js。或者您可以使用paths

paths: {
  WebAPI: '../../build/CCSEQ/WebAPI',
}

请注意键的值WebAPI也缺少.js扩展名。你也不应该把它放在那里。值是路径(不是模块名称),如果放在.js那里,您将遇到的问题是 RequireJS 将尝试查找具有.js.js扩展名的文件!

如果您想详细了解模块名称(也称为模块 ID)和路径之间的区别,我有一个专门针对该问题的答案。

于 2017-06-15T13:17:33.020 回答