私は自分のファイルを 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 イディオムを使用しないでください。module
、exports
、などは使用しないでくださいrequire
。JS 自体は安定していますが、モジュールへのパッケージ化はまだ多くの変更が行われているため、これは私の個人的なガイドラインにすぎません。興味深いコードです。ECMAScript 6 モジュールは、数年以内に CommonJS に置き換わる可能性が最も高いため、セクション 2 を純粋な ECMAScript 5 のままにして、私が好きなように「CommonJS Sandwich™」を作成することで、これを簡単に行うことができます。
セクション 3: CommonJS エクスポート
exports.helper1 = helper1;
exports.helper2 = helper2;
- また、すべてのエクスポートを最後に置くことで、パブリック API が何であるかをすばやく理解し、不注意なコピー/貼り付けによる誤ったプロパティのエクスポートを防ぐことができます。
- 私は、新しいオブジェクト リテラル
exports.foo = foo;
に代入するよりも、上記の構文を好みます。module.exports
これにより、オブジェクト リテラルの最後のプロパティで末尾のコンマの問題が回避されることがわかりました。
require
orステートメントで何か他のことを行うこと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"