为jquery和node.js使用相同的代码库

时间:2013-09-10 13:45:20

标签: javascript

我应该使用哪种javascript模式来构建javascript库?

我如何使用UMD(https://github.com/umdjs/umd)构建一个能够处理的模块 node.js,jquery和浏览器?

我无法弄清楚如何将示例node.js + browser(https://github.com/umdjs/umd/blob/master/jqueryPluginCommonjs.js)与jquery + browser(https://github.com/umdjs/umd/blob/master/commonjsAdapter.js)组合到jquery + node.js + browser。

2 个答案:

答案 0 :(得分:1)

听起来你想要这个module

它与我最近使用的模块模式非常相似,适用于nodeJs,AMD和浏览器Javascript。

;(function (global) {
  function moduleDefinition(/*dependency*/) {
    'use strict';

    function module() {
      // module code goes here
    }

    return module;

  } if (typeof exports === 'object') {
    // node export
    module.exports = moduleDefinition(/*require('dependency')*/);
  } else if (typeof define === 'function' && define.amd) {
    // amd anonymous module registration
    define([/*'dependency'*/], moduleDefinition);
  } else {
    // browser global
    global.module = moduleDefinition(/*global.dependency*/);
  }
}(this));

为了透明,我认为此代码来自here

答案 1 :(得分:1)

您链接的代码中的示例对我来说非常清楚。您将jquery模块编写为第21行的块中的普通jquery模块。

(function ($) {
    $.fn.jqueryPluginCommonJs = function () {};
})

上面的部分是关于文件如何检测它所在的环境,你不需要触摸这个位:

function (factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['jquery'], factory);
    } else if (typeof exports === 'object') {
        // Node/CommonJS
        factory(require('jquery'));
    } else {
        // Browser globals
        factory(jQuery);
    }

然后,当您的文件完成后,将其保存为单独的js文件,然后使用脚本标记或带有“require”语句的nodejs环境将其加载到浏览器中。

因为它是一个jQuery插件,如果在运行此代码时已经加载了jquery,或者在需要该文件时jquery在nodejs中运行,它只能在浏览器中工作。 (文件顶部的加载器的nod​​ejs位将尝试在节点中为您加载jquery,但您仍然必须使用npm安装它。)


每个人都对你的问题感到困惑的原因是因为很难看出如何在vanilla nodejs中使用jquery插件是有道理的。 jQuery是一个DOM操作库,默认情况下nodejs没有DOM,所以jQuery没有什么可以帮助你。

如果您正在使用类似jsDOM的东西将DOM加载到nodejs中,那么您应该已经知道如何将DOM连接到您需要使用此脚本的jQuery实例。

老实说,如果您无法理解在问题中发布的20行示例中的任何代码,那么您尝试将自定义jquery模块加载到nodejs中可能还有点早。

我建议花一些时间真正关注UMD文档,直到你正确理解那里发生的一切。与将自定义jquery模块连接到节点中的DOM相比,它的复杂程度要低一些,而且您学到的东西将帮助您了解模块中的实际情况,这些问题可能会在以后不可避免地出现问题。