【问题标题】:Migration from Dojo 1.3.1 to 1.9.3从 Dojo 1.3.1 迁移到 1.9.3
【发布时间】:2014-03-17 12:32:57
【问题描述】:

我有一个项目,其中前端是使用 dojo 1.3.1 开发的,并且有大约 100 多个自定义小部件和 dojo 文件。
我的任务是将所有代码从 Dojo 1.3.1 迁移到 Dojo 1.9.3(最新版本)。

我尝试用 1.9.3 替换 Dojo 1.3.1 源,但一切都中断了,我在 UI 上看不到任何东西。显然这是因为两个版本之间的主要语法差异,特别是定义模块和包含模块的语法变化。

这是我必须更改所有 100 多个文件中的语法并检查功能 + UI 是否正常工作的唯一方法吗?或者可能有另一个更好的解决方法?

编辑:
我使用 dojo-amd-converter 将自定义模块从 pre-AMD 转换为 AMD。有一个文件转换如下:

旧代码:

dojo.provide("myModule.objects");
dojo.require("dojo._base");

myModule.objects.psCookie = (
    function () {
        // Default Values
        var defaultArgs = {
            ident: "",
            email: ""
        }
        return function(args) {
            return myModule.objects.cleanArgs(args, defaultArgs);
        }
    }
)();

转换后的代码:

define([
    "dojo/_base",
    "dojo/_base/lang"
], function (_base, lang) {

    myModule.objects.psCookie = (
        function () {
            // Default Values
            var defaultArgs = {
                ident: "",
                email: ""
            }
            return function(args) {
                return myModule.objects.cleanArgs(args, defaultArgs);
            }
        }
    )();

现在,我在转换后面临几个问题:

GET http://localhost:8080/td/js/dojo-release-1.9.3/dojo/_base.js 404 (Not Found)
Uncaught TypeError: Cannot set property 'psCookie' of undefined /td/js/myModule/objects.js:6

知道如何解决这些问题吗?

【问题讨论】:

  • 虽然 Dojo 1.7+ 支持 AMD,但它也继续支持旧的 API,所以事情不应该完全中断。如果没有一些您遇到的错误类型的具体示例,这个问题就太宽泛了,无法解决。您可能需要查看每个 Dojo 版本的 release notes 以获取线索。
  • 我同意@KenFranqueiro。如果没有代码和/或错误,我们根本无法帮助您。
  • @KenFranqueiro 我已经更新了我的问题,请看看你能不能帮我解决这个问题。

标签: javascript dojo migration


【解决方案1】:

这里有两件事,可以解决以下错误:

GET http://localhost:8080/td/js/dojo-release-1.9.3/dojo/_base.js 404 (Not Found)

您只需从模块列表中删除 dojo/_base,例如:

define([
    "dojo/_base/lang"
], function (lang) {
    // Rest of your code
});

然后,整个dojo.provide() 系统消失了,这意味着不再有任何对象作为模块提供给您(因此您会收到该对象是undefined 的错误消息)。取而代之的是,您只需自己返回一个对象,例如:

define([
    "dojo/_base/lang"
], function(lang) {
    return {
        psCookie: /** Your code */
    };
});

但是,我不太熟悉 psCookie 在您的示例中的作用,因此您可能需要进一步解释一下。

【讨论】:

  • 我会删除“dojo/_base”依赖,但是删除后会有什么影响吗?
  • 这取决于你使用什么。 dojo.require("dojo._base") 可能包括 dojo/_base 包的所有内容。因此,如果您使用其中的任何内容,则意味着您必须明确导入模块,例如dojo/_base/langdojo/_base/declaredojo/_base/array、...。