Backbone是如何做到的.$在CommonJS模块配置中设置

How does Backbone.$ get set in CommonJS modules configuration?

本文关键字:模块 CommonJS 配置 设置 何做 Backbone      更新时间:2023-09-26

我正在浏览下面从http://backbonejs.org/backbone.js

(function(root, factory) {
  // Set up Backbone appropriately for the environment. Start with AMD.
  if (typeof define === 'function' && define.amd) {
    define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
      // Export global even in AMD case in case this script is loaded with
      // others that may still expect a global Backbone.
      root.Backbone = factory(root, exports, _, $);
    });
  // Next for Node.js or CommonJS. jQuery may not be needed as a module.
  } else if (typeof exports !== 'undefined') {
    var _ = require('underscore');
    factory(root, exports, _);
  // Finally, as a browser global.
  } else {
    root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender || root.$));
  }
}(this, function(root, Backbone, _, $) {
  // Initial Setup
  // -------------
  // Save the previous value of the `Backbone` variable, so that it can be
  // restored later on, if `noConflict` is used.
  var previousBackbone = root.Backbone;
  // Create local references to array methods we'll want to use later.
  var array = [];
  var push = array.push;
  var slice = array.slice;
  var splice = array.splice;
  // Current version of the library. Keep in sync with `package.json`.
  Backbone.VERSION = '1.1.2';
  // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns
  // the `$` variable.
  Backbone.$ = $;

在CommonJS/node.js配置中,它表示Next for Node.js or CommonJS. jQuery may not be needed as a module.,并调用factory(root, exports, _),其中jquery的第四个$参数未定义。在工厂函数中,它变为Backbone.$ = $,所以Backbone.$是否未定义?那么很多东西(AJAX、$el包装等)不会坏吗?

使用jQuery的主要原因是处理DOM操作,而这在后端(nodejs)中是无用的,因此不需要将其作为依赖项加载。为了解决这个问题,你可以创建一个简单的模块,用jQuery返回BackboneJS。

// libs/backbone.js
var backbone = require("backbone");
backbone.$ = require("jquery");
module.exports = backbone;