我有几个包含辅助函数的实用程序库,我想加载它们以便可以从 Controller 中使用它们,我想知道 在 Node 中编码实用程序库的最佳实践是什么。
我有点困惑,因为有几种方法可以做到这一点,我不确定哪种方法最好/更合适/更可靠。这里有 2 个选项,但我想知道它们是否是最好的(例如,我见过使用 module.exports = exports = function(){} 等的片段)
//option1.js
"use strict";
module.exports = function(){
exports.test1 = function(){ console.log('hi I'm test1')};
exports.test2 = function(){ console.log('hi I'm test2')};
return exports;
};
//option2.js
"use strict";
module.exports = {
test1 : function(){ console.log('soy test1')},
test2 : function(){ console.log('soy test2')}
};
//test_controller.js
/* Requiring helpers in different ways */
var option1 = require('./option1.js')();
var option2 = require('./option2.js');
最佳答案
我认为我的文件分为 3 个部分:
var lib1 = require("lib1");
var lib2 = require("lib2");
您不需要任何额外的包装函数。所有 Node 模块都是automatically wrapped通过 node.js 在一个函数中,这样做没有任何好处,只会增加困惑
如果需要,这应该几乎完全是带有一些支持变量或顶级模块代码的函数。
var MY_CONST = 42;
function helper1() {
//excellent code here
}
function helper2() {
//excellent code here
}
保留第 2 节纯 JS。不要在这个中间的“纯”部分使用 commonJS 成语。不要使用 module、exports、require 等。这只是我个人的指导方针,因为 JS 本身是稳定的,但打包到模块中是仍然有很多变化,最好将无关的且可能发生变化的 CommonJS 位与有趣的代码位分开。 ECMAScript 6 模块最有可能在几年内取代 CommonJS,所以通过保持第 2 节纯 ECMAScript 5 并制作一个我喜欢称之为“CommonJS Sandwich™”的方式,让自己更容易做到这一点。
exports.helper1 = helper1;
exports.helper2 = helper2;
exports.foo = foo; 语法,而不是将 module.exports 分配给一个新的对象字面量。我发现这避免了对象文字的最后一个属性的尾随逗号问题。require 或 exports 语句做任何其他事情几乎可以肯定是没有必要的,而且是不必要的花哨或魔术。在你进阶之前,不要在这里做任何花哨的事情。 (即便如此,如果你不是 TJ Holowaychuk,你可能只是在傻)function degreesToRadians(degrees) {}
module.exports = degreesToRadians;
保持小而简单。
如果你的模块是一组辅助函数,你应该导出一个包含这些函数的对象作为属性
var foo = require("foo");
function doubleFoo(value) {
return foo(value) * 2;
}
function tripleFoo(value) {
return foo(value) * 3;
}
exports.doubleFoo = doubleFoo;
exports.tripleFoo = tripleFoo;
如果你的模块是面向对象使用的类设计,导出构造函数
function GoCart() {
this.wheels = 4;
}
GoCart.prototype.drive = function drive() {
//vroom vroom
}
module.exports = GoCart;
一旦您掌握了上述 2 种模式(真的!)并有信心导出一个带有选项的工厂函数,并且可能会做一些其他动态的事情,那就去做吧,但如果有疑问,请坚持前 2 个更简单的选择.
//do-stuff.js
function doStuff(howFast, what) {
return "I am doing " + what + " at speed " + howFast;
}
function setup(options) {
//The object returned by this will have closure access to options
//for its entire lifetime
return {doStuff: doStuff.bind(null, options.howFast)};
}
module.exports = setup;
所以你可以像这样使用它
var doStuff = require("./do-stuff")({howFast: "blazing speed"});
console.log(doStuff.doStuff("jogging"));
//"I am doing jogging at speed blazing speed"
关于node.js - node.js 中所需的结构化库的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17936515/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
您将如何构建一个简单的Sinatra应用程序?我正在制作,我希望该应用具有以下功能:“应用程序”更像是一个包含所有信息的管理仪表板。然后另一个应用程序将通过REST访问信息。我还没有创建仪表板,只是从数据库中获取东西session和身份验证(尚未实现)您可以上传图片,其他应用可以显示这些图片我已经使用RSpec创建了一个测试文件通过Prawn生成报告目前的设置是这样的:app.rbtest_app.rb因为我实际上只有应用程序和测试文件。到目前为止,我已经将Datamapper用于ORM,将SQLite用于数据库。这是我的第一个Ruby/Sinatra项目,所以欢迎任何和所有建议-我应
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来
我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion
我花了几天时间尝试安装ruby1.9.2并让它与gems一起工作:-/我最终放弃了我的MacOSX10.6机器,下面是我的Ubuntu机器上的当前状态。任何建议将不胜感激!#rubytest.rb:29:in`require':nosuchfiletoload--mongo(LoadError)from:29:in`require'fromtest.rb:1:in`'#cattest.rbrequire'mongo'db=Mongo::Connection.new.db("mydb")#gemwhichmongo/usr/local/rvm/gems/ruby-1.9.2-p0/g
因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration