加载Markdown时出现奇怪的Requirejs行为

时间:2013-12-04 11:06:50

标签: 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.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/'
    }
  });
});

这是一种奇怪的行为。在我的initialize中,当我点击调试器时,我可以访问我导入的markdown对象,但如果我尝试使用markdown对象,那么它总是{ {1}}。如果我将undefined放在markdown或其中一个initialize方法中,则render变量为markdown。这没有任何意义,但有一些我不了解undefined的行为。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

在阅读了markdown-js的凉亭安装代码之后,我发现什么凉亭安装将无法与RequireJS一起使用。尝试添加此填充程序:

"markdown": {
    exports: "markdown"
}

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

答案 1 :(得分:1)

您可以在define子句本身中要求所有这些模块:

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

    // do stuff
});

另外,你的意思是“如果我在初始化或其中一种渲染方法中放入降价”?你的意思是在初始化和渲染中实际明确要求降价吗?有没有理由不在上面标记的define子句中加载markdown?

如果您在初始化或渲染中明确要求降价,我不确定为什么会返回undefined,但请告诉我是否将define条款移至需要修复您的问题(或者如果您不能这样做)。也许您可以在markdown模块中发布代码(如果它不是库)?