第4章ノードモジュラーと標準化CommonJS
いくつかの章では、以前の研究で、我々は基本的にNodeJSをプログラミングの基礎を習得し、私たちも直感的に問題を発見し、我々はJSのプログラミングブラウザの前に学ぶとき、違いは依然として非常に大きいです;すべてのJavaScriptプログラミングを、なぜこの違いはありますか?私は、抗Apacheサーバの以前の例を書いて使用し、内蔵FSモジュール、瞬間モジュール、および当社が独自に書き込むことはできませんので、直接、使用を引き継ぐされ、書き込みされていないこれらのモジュールを使用私たちが使用する他のプログラマが直接利用できるようにすることはできませんモジュールを書いた場合、モジュール、書き込みに、ルールが何をどのように、あなたはどのように使うべきか?
電子デスクトップアプリケーションフレームワーク、クロスプラットフォーム:https://electronjs.org/
4.1 CommonJS規範の起源
JSのパフォーマンス能力は、ホスト環境が提供するAPIの性能に依存web1.0時代に、W3Cの組織は、HTML5の開発と、Web2.0の時代に、ブラウザのために登場し、より標準的なAPIを標準化されたサポートを提供しますブラウザは、しかし、JSのバックエンドで標準動かを開発します。
呼ばれるMozillaのエンジニアケビンDangoorにより、2009年1月に提案ServerJS仕様は、2009年8月、それはAPIの広い適用性を示すために、*、* CommonJSに社名を変更しました。
私はここに記載してることは技術的な問題ではありません。それは、人々が一緒に取得し、前進と一緒に何か大きなものとクーラーを構築を開始する決定を下すの問題です。
私はここで説明した技術的な問題ではありませんよ。これは、一緒に人々である一歩前進することを決定し、何か大きなものクーラーの問題を一緒に構築を開始します。
-Kevin Dangoor
4.2 CommonJSモジュール仕様
分けたモジュールの非常に単純な定義を、CommonJS:
図1に示すように、モジュール参照:
使用require()
APIモジュールを導入する方法と、
2、モジュール定義:
そのようなモジュールをエクスポート現在のオブジェクトモジュールデータまたは方法の使用。
モジュール自体を表すモジュールオブジェクトモジュールは、モジュールのエクスポートオブジェクトは、データエクスポートの特性を有し、またあります。
実際には、輸出先はmodule.exportsは参照です。 exports === module.exports
図3に示すように、モジュール識別子:
実際には、それはモジュールのファイル名で、あなたは小さなこぶのルールにちなんで名付けられた法令を遵守しなければならないrequire()
導入時に使用される. 或 ..
相対パスの先頭に
パスまたは/
絶対パス、あなたは拡張機能が導入されたファイルを書き込むことができません。
キー注:スコープメソッドと変数は、モジュール内でのみモジュール、各モジュールはお互いを乱すことなく、独立したスペースがあります。
CommonJS構築モジュール機構は、当社の汚染や変数置換の問題を輸出考慮しなくて導入された、と比較命名空间
メカニズム、大きなギャップがあります。
4.3ノードはCommonJS(ノードモジュラー)を達成します
上記のコードは、カスタムモジュールの基本的なルールはこれですフォーカス
4.4ロードモジュールのルールと秩序
CommonJSの明細書において、require()
(中に導入)ローディングモジュールは、モジュール識別子は、相対または絶対パスモジュールの位置を指定する必要がありますが、ノードの実装では、我々は、モジュールパスを指定することはできません;とおりrequire('fs')、require('moment')
、
あなたがロードされたカーネルモジュールまたはサードパーティのモジュールであるパスを指定しない場合、ロード・カスタムモジュールが一般的であるの負荷のパスを指定します。
モジュールがロードされているものは関係ありませんが、それが優先的にキャッシュからロードされます。
ノードの負荷モジュールは、このモジュールが渡された場合、キャッシュされたダイレクトますロードされると、ガガは再び将来的に再び参照このモジュールをロードしません(例:モジュールが二回ロードされている場合、モジュールのコードが唯一となります一度実行)
コアモジュールのロード順序およびサードパーティのモジュールです。
何コアモジュールが存在しない場合は、最初のロードコアモジュール、コンテンツモジュールをノードにインストールされているコアは、キャッシュをロードした後、実行のバイナリ実行荷重速度をまとめた、負荷サードパーティモジュール
サードパーティのモジュールがルールをロード:
- 現在のファイルのnode_modulesディレクトリモジュールの内容を見つけるためにまず、
- 瞬間:見つかった場合は、ディレクトリへのディレクトリは、次のような、モジュール名を検索します
- あなたは瞬間ディレクトリを見つけた場合は、そのディレクトリのpackage.json内のファイルを見つけます
- 見つかったpackage.jsonファイル場合は、ファイルの主な属性を見つけます
- 主な属性が見つかった場合、ファイルはあなたが得る属性に対応します
- ディレクトリには、後の瞬間を見つけるためにした場合、
- ませんpackage.json
- またはNOメイン属性package.jsonはありません
- またはメイン属性を持っていますが、パスがポイントを存在しません。
- > index.json-> index.nodeファイル - ノードにはindex.jsはありませんどのような瞬間を見るために、デフォルトのディレクトリになります
- インデックスは見つけることができないか、見つけることができないか、モーメントnode_modulesを見つけることができない場合
- その後node_moudlesは(同上ルール)を見つける見つけるために、親ディレクトリを入力します。
- あなたが見つけることができない場合は、現在のファイルがディスクのルートディレクトリに属するまで上向きに続け
- ディスクのディレクトリには、直接、エラーを発見していないものとした場合
4.5モジュラー包装ケース
アイデア:
1:サーバー機能 - >アパッチ
2:要求を待機 - >ルーティング
3:サービス要求の処理 - >コントローラ
4:取得データ(データ処理) - >モデル
5:表示データ - >ビュー
ケースクライアントのレンダリングの再構築
http.jsを変更 - サーバモジュール
var http = require('http');
var router = require('./router');
var server = http.createServer();
router(server);
server.listen(8000,function(){
console.log('欢迎来到node世界')
})
ルーティングモジュール - カスタムモジュールrouter.jsを追加
var controller = require('./controller');
module.exports = function(server){
server.on('request',function(req,res){
var urls = req.url;
if(urls == '/'){
// 需要获取html文件中的内容
// 响应给客户端
// 业务层模块的调用
controller.index(function(data){
// 利用回调函数获取数据
res.end(data);
});
}else if(urls == '/getnames'){
// 业务层模块的调用
// 将请求对象及响应对象传入业务层方法,在业务层做http响应处理
controller.getNames(req,res);
}else{
// 响应静态资源
require('fs').readFile('.'+urls,function(err,data){
res.end(data);
})
}
})
}
contrllor.js - サービスモジュール
var fs = require('fs');
var moment = require('moment');
module.exports = {
index: function (callback) {
// 返回静态页面
fs.readFile('./index.html', 'utf8', function (err, data) {
callback(data);
})
// console.log('index');
},
getNames: function (req, res) {
// console.log('getnamesssss');
fs.readdir('./', 'utf8', function (err, data) {
var filearr = [];
var cont = 0;
for (var i = 0; i < data.length; i++) {
// 2:
(function (i) {
// 3:
fs.stat(data[i], function (err, stats) {
cont++;
// 获取文件名
// 问题:文件名为 undefined
// 原因:在循环结束之后,函数才会被调用,而此时i已经被修改为最后的值
// 解决:在每次循环中形成一个独立的作用域保留i的值,
// 当异步函数调用时,获取到的是独立作用域中的i
filearr[i] = {};
filearr[i].name = data[i];
// 获取文件的其他属性
filearr[i].type = stats.isFile();
filearr[i].size = stats.size;
// filearr[i].mtime = stats.mtime;
filearr[i].mtime = moment(stats.mtime).format("YYYY-MM-DD hh:mm:ss");
// 异步函数调用次数与文件数相等时,服务器作出响应并断开
if (cont == data.length) {
res.end(JSON.stringify(filearr));
}
})
})(i);
}
})
}
}
この文書は、参考図書、文書、ブログ、マニュアルや他のリソース、呉Mingshiすべての最終的な解釈の数が多いです。
参考リソースリスト:
https://nodejs.org/zh-cn/ Node.jsの公式サイト
http://nodejs.cn/は、中国のネットワークをNode.jsの
「素人の言語のNode.js」スピリット公園、人々のポストプレス
https://en.wikipedia.org/wiki/CommonJSウィキペディア
(第3版)「のECMAScript 6は、はじめに」前方ルアンYifeng、電子工業プレス
(上段、中段、下段巻)[US]カイル・シンプソン、人々のポストを押して、「あなたはJavaScriptを知りません」
http://www.expressjs.com.cn/中国のネットワークを表現