CommonJSはjavascriptの生産性をどのように向上させるか

4096 ワード

JAvascriptの最初の設計には良好なコード組織特性が含まれておらず、importもincludeもなく、言語的に非常に未熟である.しかし、最初のネットワーク環境では、javascriptはよく機能していました.当時のネットワーク環境は非常に簡単だったので、javascriptもブラウザに埋め込まれたスクリプト言語として、プログラマーが簡単なタスクを遂行するのに役立ちました.
しかし、ハードウェアの性能が向上するにつれて、ネットワーク帯域幅が向上し、ユーザーがネットワークから得ることができる情報と資源もますます多くなり、ネットワーククライアントで一般的なプログラミング言語としてjavascriptの任務もますます多くなり、最大500行を超えないhtmlにスクリプトを埋め込み、今では万行以上の大型libraryとして、コードをうまく組織できなければ、大規模なプロジェクトを完成することはできません.例えばjavaを書いて、packageがなければ、あなたが開発したクラスライブラリの名前はAで、私はあなたが書いたクラスライブラリを多重化したいと思っていますが、私の古いコードの中にもAがあります.私は私のコードを修正するか、あなたのコードに修正しなければなりません.人力を浪費しました.特に、もしあなたが開発したプログラムの一部がimport(module)であれば、私が開発したものはinclude(module)で、importは私がファイルを読み取るために使用しているので、私たちの2つの部分のプログラムは互いに多重化することができなくて、すべて“reinvente wheel”.javascriptはあいにくこのような機能を提供していないので、プログラマーたちは自分で文法の上でクラスの一連のcommon practiseを設計して、つまり約束の習慣です.
約束の習慣は動的言語にとって非常に重要である.動的言語は静的言語のように実行前にコンパイラ検査を行うことができないため、ある時点で1つのオブジェクト1つのモジュールのタイプや機能がいつでも変更される可能性があり、言語にサポートが提供されていない場合、みんなで規範的な習慣を形成すれば、大規模なプロジェクトを構築する間のコミュニケーションを効果的に減らすことができる.また、ダイナミック言語自体も非常に柔軟性を提供しています.これは、springよりもrorの習慣が優れている理由でもあります.
javascriptのいくつかの大牛たちもこのようなことをしたいと思っています.みんなのプログラミング習慣を統一して、大部分の人が一緒に大きなプロジェクトを作ることができます.あなたが開発したコードはいくつかの共通のインタフェースに従っているので、私はプロジェクトを開発するときに直接持って来ることができます.中には再学習の過程は必要ありません.コードの多重化が大幅に向上したので、今ではネット上で雨後のタケノコのように爆発してこんなに多くのjavascriptのクラスライブラリが出てきて、javascriptは突然強くなって、テストして私は直接shouldを使うことができることを知っています.js、mongodbにアクセスするにはmongojsを直接使用できます.そして、私は簡単なrequireだけでこれらのクラスライブラリを引用することができることを知っています.彼らが「自分のコードを汚す」ことを心配する必要はありません.そうすれば、私はこれらの機能を書き換える必要はありません.これらのクラスを統合するのに苦労する必要はありません(以前、jqueryを使っているときにprototypeを利用しているとき、ロード順序に非常に頭を悩ませていました.そうしないと、Dateクラスは予想外のlibの中にあるかもしれません).
 
javascriptでcommon practiseを構築してjavascriptプログラマーが従う習慣にしようとした人たちの議論の結果はcommon jsだった.
common jsはconsole,filesystem,binaryなど、一連の標準(specification)を定義しているので、consoleを使うときに必ずconsole eがあることを知っています.log、fsを使うときはfs.open,fs.writeなど.その中で最も重要な部分はmoduleを定義することであり、http://www.commonjs.org/specs/modules/1.0/という規範にjavascriptのmoduleがそれらの基準に従うべきであることを定義し、他の人がこのような基準に従うと簡単にこのmoduleを使用することができる.
例:
math.jsではaddメソッドが定義されています
// File: math.js

exports.add = function() {

    var sum = 0, i = 0, args = arguments, l = args.length;

    while (i < l) {

        sum += args[i++];

    }

    return sum;

};

require('math')を使用することでincrement.jsはmathで参照する.jsで定義された方法
// File: increment.js

var add = require('math').add;

exports.increment = function(val) {

    return add(val, 1);

};

 program.jsでincrementを参照する.jsの方法、ここでrequire('increment')は実際にincrementを返します.jsのexports
//File: program.js

var inc = require('increment').increment;

var a = 1;

inc(a); // 2

 
 
このように世界の異なる隅に分布している人は一緒に協力して開発することができて、あなたはfilesystemを開発して、私はnetworkを開発して、これらのクラスライブラリはすべて一緒に仕事をすることができます.重複労働が減少し、クラスライブラリが豊富になると同時に開発者の開発作業も容易になる.多くのものがネット上で他の人が開発したlibraryのサポートを見つけることができるからだ.だからnodejsも簡単に火をつけました!