我应该使用哪种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。
答案 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中运行,它只能在浏览器中工作。 (文件顶部的加载器的nodejs位将尝试在节点中为您加载jquery,但您仍然必须使用npm安装它。)
每个人都对你的问题感到困惑的原因是因为很难看出如何在vanilla nodejs中使用jquery插件是有道理的。 jQuery是一个DOM操作库,默认情况下nodejs没有DOM,所以jQuery没有什么可以帮助你。
如果您正在使用类似jsDOM的东西将DOM加载到nodejs中,那么您应该已经知道如何将DOM连接到您需要使用此脚本的jQuery实例。
老实说,如果您无法理解在问题中发布的20行示例中的任何代码,那么您尝试将自定义jquery模块加载到nodejs中可能还有点早。
我建议花一些时间真正关注UMD文档,直到你正确理解那里发生的一切。与将自定义jquery模块连接到节点中的DOM相比,它的复杂程度要低一些,而且您学到的东西将帮助您了解模块中的实际情况,这些问题可能会在以后不可避免地出现问题。