23

ヘルパー関数を含むいくつかのユーティリティ ライブラリがあり、コントローラから使用できるようにそれらをロードしたいのですが、ノードでユーティリティ ライブラリをコーディングするためのベスト プラクティスは何だろうと考えています。

それを行うにはいくつかの方法があり、何が最適であるか、より適切であるか、より信頼性が高いかがわからないため、少し混乱しています。ここに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');
4

2 に答える 2

40

私は自分のファイルを 3 つのセクションで考えています。

セクション 1: CommonJS の依存関係

var lib1 = require("lib1");
var lib2 = require("lib2");

追加のラッパー関数は必要ありません。すべてのノード モジュールはnode.js によって関数内で自動的にラップされます。これを行っても利点はなく、混乱が生じるだけです。

セクション 2: プレーンな JavaScript コード

これは、サポートする変数または必要に応じてトップレベルのモジュール コードを散りばめたほぼ排他的な関数である必要があります。

var MY_CONST = 42;

function helper1() {
    //excellent code here
}

function helper2() {
    //excellent code here
}

セクション 2 は純粋な JS のままにします。この中間の「純粋な」セクションでは commonJS イディオムを使用しないでください。moduleexports、などは使用しないでくださいrequire。JS 自体は安定していますが、モジュールへのパッケージ化はまだ多くの変更が行われているため、これは私の個人的なガイドラインにすぎません。興味深いコードです。ECMAScript 6 モジュールは、数年以内に CommonJS に置き換わる可能性が最も高いため、セクション 2 を純粋な ECMAScript 5 のままにして、私が好きなように「CommonJS Sandwich™」を作成することで、これを簡単に行うことができます。

セクション 3: CommonJS エクスポート

exports.helper1 = helper1;
exports.helper2 = helper2;
  • また、すべてのエクスポートを最後に置くことで、パブリック API が何であるかをすばやく理解し、不注意なコピー/貼り付けによる誤ったプロパティのエクスポートを防ぐことができます。
  • 私は、新しいオブジェクト リテラルexports.foo = foo;に代入するよりも、上記の構文を好みます。module.exportsこれにより、オブジェクト リテラルの最後のプロパティで末尾のコンマの問題が回避されることがわかりました。
  • requireorステートメントで何か他のことを行うことexportsは、ほぼ確実に不必要であり、不必要に巧妙または魔法です。上級者になるまでは、ここで派手なことをしないでください。(それでも、もしあなたが TJ ホロウェイチュクではないのなら、あなたはおそらくただ馬鹿げているだけです)

何をエクスポートすればよいですか

単一の関数 (@substack スタイル)

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;

Factory/Config クロージャ関数

上記の 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"
于 2013-07-30T02:03:02.340 に答える