Javascript 加载降价时奇怪的Requirejs行为

Javascript 加载降价时奇怪的Requirejs行为,javascript,requirejs,Javascript,Requirejs,我有一个requirejs模块,试图在其中加载markdownjs。文件如下: define(function(require) { 'use strict'; var Backbone = require('backbone'); var blogCollectionTemplate = require('hbs!app.templates/blog.collection.view'); var BlogModelView = require('views/blog.item

我有一个
requirejs
模块,试图在其中加载
markdownjs
。文件如下:

define(function(require) {
  'use strict';

  var Backbone = require('backbone');
  var blogCollectionTemplate = require('hbs!app.templates/blog.collection.view');
  var BlogModelView = require('views/blog.item.view');
  var markdown = require('markdown');

  var BlogCollectionView = Backbone.View.extend({
    template: blogCollectionTemplate,

    initialize: function() {
      debugger;
    },

    render: function() {
      this.$el.html(this.template());
      this.renderAll();
      return this;
    },

    renderAll: function() {
      var that = this;
      this.collection.each(function(blog) {
        that.renderItem(new BlogModelView({model: blog}));
      });
    },

    renderItem: function(blog) {
      this.$el.find('#blog-posts').append(blog.render(blog).el);
    }
  });

  return BlogCollectionView;
});
这是我的
require.config

define(function() {

  require.config({
    hbs : {
      templateExtension : 'hbs',
      disableHelpers: true,
      disableI18n : true
    },

    shim: {
      'backbone': {
        deps: [
          'underscore',
          'jquery'
        ],
        exports: 'Backbone'
      },
      bootstrap: {
        deps: [ 'jquery' ]
      },
      DlHighlight: {
        exports: 'DlHighlight'
      },
      'jqueryMockAjax': {
        exports: '$.mockjax',
        deps: ['jquery']
      },
      json2 : {
        exports: "JSON"
      },
      'underscore': {
        exports: '_'
      }
    },

    paths: {

      backbone: 'libs/backbone/backbone',
      bootstrap: 'libs/bootstrap/dist/js/bootstrap',
      DlHighlight: 'libs/hl/hl-all',
      highlight: 'libs/highlightjs/highlight.pack',
      jquery: 'libs/jquery/jquery',
      jqueryMockAjax: 'libs/jquery-mockjax/jquery.mockjax',
      markdown: 'libs/markdown/lib/markdown',
      text: 'libs/text/text',
      underscore: 'libs/underscore/underscore',

      hbs: 'libs/hbs/hbs',
      handlebars: 'libs/hbs/Handlebars',
      i18nprecompile: 'libs/hbs/hbs/i18nprecompile',
      json2 : 'libs/hbs/hbs/json2',

      'app.templates': '../templates/'
    }
  });
});

这就是奇怪的行为。在我的
初始化
中,当我点击调试器时,我可以访问我导入的
标记
对象,但是如果我尝试使用
标记
对象,那么它总是
未定义
。如果我将
markdown
放入
initialize
或其中一个
render
方法中,则
markdown
变量为
未定义
。这没有任何意义,但是关于
requirejs
是否有一些行为我不了解。有什么想法吗?

您可以在
定义
条款中要求所有这些模块:

define([
    'backbone',
    'hbs!app.templates/blog.collection.view',
    'views/blog.item.view',
    'markdown'
], function (
    Backbone,
    blogCollectionTemplate,
    BlogModelView,
    markdown
) {
    'use strict';

    // do stuff
});
另外,“如果我在initialize或其中一个呈现方法中放置markdown”是什么意思?你的意思是在初始化和渲染时确实需要标记吗?是否有任何理由不只是在上面标记的
define
子句中加载标记


如果您在initialize或render中明确要求降价,我不确定为什么会返回
undefined
,但请告诉我将需求移动到
define
子句是否解决了您的问题(或者如果您无法做到这一点)。也许你可以在
markdown
模块中发布代码(如果不是库的话)

在阅读了markdown js的bower安装代码后,我发现bower安装的东西不能像现在一样与RequireJS一起工作。尝试添加此垫片:

"markdown": {
    exports: "markdown"
}

至于为什么您能够在没有垫片的情况下在调试器中获得
标记的值,我相信您是从全局范围获得它的(可能没有意识到它)。Markdown js在加载时将自身安装到全局范围(
window.Markdown
,如果没有其他变量干扰,则可作为
Markdown
访问)。这是推测,但符合事实。

您要加载哪个降价模块?如果是第三方模块,则可以使用链接。我正在尝试加载
markdown
模块,但任何模块都可以。谢谢。该模块是AMD感知的,因此应该可以工作。我认为您传递给RequireJS的配置中有一些不正确的地方。你能把它添加到你的问题中吗?我添加了配置,但是请记住,如果我在初始化块中放置了一个
调试器
,并且我只导入
标记
,我就可以访问它。只有当我尝试在模块中使用
标记时,它才是
未定义的。您是如何在使用markdown js的位置安装它的?npm,bower,download+grunt build,下载他们的一个tgz捆绑包?我在
初始化
渲染
方法中放置
标记
的意思是,我会像正常情况一样在顶部导入
标记
,但是当我尝试使用参考
标记
时,然后,它将在定义之前的同一
调试器
语句中被取消定义。我更改了我的
define
语句以加载上面显示的模块,同样的事情发生了,我的
markdown
在我的
initialize
函数中是
未定义的。我会保留这个答案,以防有人无意中发现。这很有效。为什么没有垫片它就可以工作?当我点击我的
debugger
语句时,我能够在没有垫片的情况下访问
markdown
。我想我永远也猜不到这一点,因为我假设他使用的
backbone
也在全球范围内导出到
backbone
-P