【问题标题】:Moment js undefined after r.js buildingr.js 构建后的时刻 js 未定义
【发布时间】:2014-01-31 21:31:30
【问题描述】:

有人在 r.js 构建中成功加载了 moment.js(使用杏仁)吗?

我正在使用 backgrid 和 backgridMomentCell:在我构建我的 main.min.js 文件之前一切正常。构建时间后的时刻未定义,因此 backgridMomentCell 扩展无法找到。

我已经尝试了几个选项(甚至是 shim),但都没有成功。

如果 somedoby 有一个可以工作的 require.config,他/她可以分享吗?

编辑(很抱歉没有尽快回复,发布时间让我远离 SO):

在构建文件 BackGridMomentCell 中不断抛出“时刻未定义”错误。

我在评论中要求的代码


requirejs.config({
    paths: {
        backbone: 'vendor/backbone-1.1.0',
        backbonePageable: 'vendor/backbone-pageable-1.4.1',
        backgrid: 'vendor/backgrid/js/backgrid-0.2.6',
        backgridPaginator: 'vendor/backgrid/js/extensions/paginator/backgrid-paginator',
        backgridMomentCell: 'vendor/backgrid/js/extensions/moment-cell/backgrid-moment-cell',
        bootstrap: 'vendor/bootstrap/js/bootstrap-3.0.1',
        bootstrapDatepicker: 'vendor/bootstrap-datepicker/bootstrap-datepicker-fda46bb',
        codemirror: 'vendor/codemirror/js/codemirror-3.20',
        codemirrorMarkdown: 'vendor/codemirror/mode/markdown/markdown',
        jsDiff: 'vendor/diff-1.0.7',
        fullCalendar: 'vendor/fullcalendar/fullcalendar-1.6.4',
        fullCalendarJqueryUiCustom: 'vendor/fullcalendar/jquery-ui-1.10.3.custom.min',
        jquery: 'vendor/jquery-1.10.2',
        marked: 'vendor/marked-0.2.10',
        select2: 'vendor/select2/select2-3.4.5',
        speakingurl: 'vendor/speakingurl-0.4.0',
        underscore: 'vendor/underscore-1.5.2',
        moment: 'vendor/moment.with.langs'

    },
    shim: {
        backbone: {
            deps: ['jquery', 'underscore'],
            exports: 'Backbone'
        },
        backgrid: {
            deps: ['jquery', 'backbone', 'underscore'],
            exports: 'Backgrid'
        },
        backgridPaginator: {
            deps: ['backgrid']
        },
        backgridMomentCell: {
            deps: ['backgrid','moment']
        },
        bootstrap: {
            deps: ['jquery']
        },
        bootstrapDatepicker: {
            deps: ['jquery']
        },
        codemirror: {
            exports: 'CodeMirror'
        },
        codemirrorMarkdown: {
            deps: ['codemirror'],
            exports: 'codemirrorMarkdown'
        },
        fullCalendar: {
            deps: ['jquery', 'fullCalendarJqueryUiCustom']
        },
        fullCalendarJqueryUiCustom: {
            deps: ['jquery']
        },
        select2: {
            deps: ['jquery']
        },
        underscore: {
            exports: '_'
        }
    }
});

我的模块的头


define([
    'jquery',
    'fullCalendar',
    'underscore',
    'backgrid',
    'backgridPaginator',
    'moment',
    'backgridMomentCell',
    'backbone',
    'collections/ItemPaginatedCollection',
    'utils/BackgridCustomUriCell'
], function ($, _fullCalendar, _, Backgrid, _backgridPaginator, moment, MomentCell,Backbone, ItemPaginatedCollection, BackgridCustomUriCell) {

"use strict";

....

编辑 3:

在我编译的 main.js 工作之前加载 moment.js 但不是最佳恕我直言。

【问题讨论】:

  • 我正在使用 moment.js 和 twitter bootstrap ,工作正常没有问题,你能分享你的代码和你需要做的工作

标签: backbone.js requirejs momentjs backgrid


【解决方案1】:

我发现的最简单的两种方法:

1) 将 backgrid-moment-cell.js 包装在 RequireJS API 中指定的 CommonJS wrapper code 中。您可以使用 API 中提到的转换工具在构建过程中动态执行此操作。

2) 在 build.js 中需要内联矩单元并将 findNestedDependencies 设置为 false。

问题在于,moment-cell 代码在初始化时将this 传递给自身,并查找“exports.moment”或“this.moment”。

在相关说明中,在 shim 中为 moment-cell 包括 moment 是不必要的,从技术上讲,您应该包括下划线。 From the API:

仅使用其他“垫片”模块作为垫片脚本的依赖项,或 没有依赖关系并在它们之后调用 define() 的 AMD 库 还创建一个全局(如 jQuery 或 lodash)。否则,如果您使用 AMD 模块作为 shim 配置模块的依赖项,在构建之后, 该 AMD 模块可能不会被评估,直到在 构建执行,将发生错误。最终的解决方法是 升级所有填充代码以具有可选的 AMD define() 调用。

Moment 实际上是一个 AMD 模块。

【讨论】:

【解决方案2】:

您的问题很可能是您没有在构建文件中指定findNestedDependencies true。

看看这个提交(来自我的book on RquireJS and Backbone.Marionette):https://github.com/davidsulc/structuring-backbone-with-requirejs-and-marionette/commit/85d3d3dd40d0cebd858224c3903a12d6998d668d

【讨论】:

  • 我试过没有成功。 (一个月前买了你的书,很棒,非常有用)
【解决方案3】:

我认为这与时刻的全局对象被弃用有关。

2.4.0 - Deprecate globally exported moment, will be removed in next major

https://github.com/moment/moment

现在需要在特定模块中定义时刻。

【讨论】:

  • 我确实在模块中定义了它,但同样的问题:单独使用所有文件时就像一个魅力,在构建一个主文件时抛出错误
猜你喜欢
  • 1970-01-01
  • 2016-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
相关资源
最近更新 更多