nodejs(パートIII):必要と輸出は、httpモジュールサプリメント、JavaScriptの標準スタイルでnodejs、ファイルモジュールをnodejs

Aは、ファイルモジュールをnodejs

nodejsでは、ユーザーが作成したモジュールは、と呼ばれるファイルモジュール

ファイルのモジュールは、JSファイル、ファイルまたはJSONの.nodeファイルのファイルを参照します。参照されたファイルのパスでモジュールを使用すると、ファイルを追加したいとき:/.../.../ xxx.jsは、絶対パスを示し、/ xxx.jsは相対パス(同じフォルダxxx.js)を表し.. ./親ディレクトリを示しています。もしどちらもプラスも/.../,../プラス./、その後、いずれかのモジュールはどちらかnode_modulesファイルフォルダからロードされたコアモジュール、です。

Node.jsの(1)は、複数のJavaScriptファイルは、方法を必要と実行するだけ負荷スクリプトには、この方法が必要になります。

カスタムモジュールの相対パスを記述する必要があります。/ JS接尾辞を省略してもよいです。

デモ

同じフォルダのテストでは、a.js、b.jsを作成

コンテンツを書かれていました

a.jsコンテンツ:

console.log('a start')
require('./b')
console.log('a end')

b.jsコンテンツ

console.log('b msg')

実行a.js、出力

ERROR: The process "node.exe" not found.
a start
b msg
a end
[Finished in 0.5s]

分析:コードはここで実行される、ローディングコードでb.jsを必要

(2)負荷がコードのみを実行する必要が、モジュールが範囲から単離されます

それは内部、外部にアクセスすることができ、ファイルやモジュールスコープ(Node.jsの中にグローバルスコープの概念)との間で、モジュールが完全に閉じられているので、内部ファンが外部にアクセスすることはできません。

試験1:ファイル・モジュールとの間の試験値は、互いに影響を与えるか、覆われます

同じフォルダのテストでは、a.js、b.jsを作成

コンテンツを書かれていました

a.jsコンテンツ:

var foo = 'aaa'
console.log('a start')
require('./b')
console.log('a end')
console.log('foo 的值是:', foo)

b.jsコンテンツ

console.log('b msg')
var foo = 'bbb'
console.log('b end')

実行a.js、出力

ERROR: The process "node.exe" not found.
a start
b msg
b end
a end
foo 的值是: aaa
[Finished in 0.4s]

分析:モジュールとの間に導入された出力結果b.jsから見ることができ、値a.js FOOに影響を及ぼさないように、ファイルスコープ付きファイルから単離されます

試験2:に導入機能モジュールでファイル・モジュール内の元のファイルを呼び出します

同じフォルダのテストでは、a.js、b.jsを作成

コンテンツを書かれていました

a.jsコンテンツ:


console.log('a start')

function add(x, y) {
  return x + y
}

require('./b')
console.log('a end')

b.jsコンテンツ

console.log('b msg')
console.log(add(10, 20))
console.log('b end')

実行a.js、出力実行エラーが、追加の関数が定義されていない、定義されていない、元のファイルを参照することができない機能モジュール

二、輸出のnodejsと必要

必要とする

require関数は、ロードしたオブジェクトをエクスポートするモジュールを返すために、モジュール名を渡して、現在のモジュール内の他のモジュールを使用するために使用されます。モジュールは、(内の相対パス名を使用することができる./開始)、または絶対パス(/またはC:文字の先頭など)。さらに、モジュール名の.js拡張子を省略してもよいです。ここでは一例です。

2つの方法がアクションを必要があります。

  1. ファイルをロードし、モジュール内のコードを実行
  2. インタフェースオブジェクトは、モジュールのロードファイルでエクスポートされます
var foo1 = require('./foo');
var foo2 = require('./foo.js');
var foo3 = require('/home/user/foo');
var foo4 = require('/home/user/foo.js');

// foo1至foo4中保存的是同一个模块的导出对象。

さらに、次の方法を使用してJSONファイルをロードして使用することができます。

var data = require('./data.json');

輸出

exportsオブジェクトは、現在のモジュールのオブジェクト、モジュールパブリックプロパティを導出するための方法を導出します。他のモジュールrequire現在のモジュールを使用するときは、現在のモジュールの機能が得られるexportsオブジェクト。次の例の公開方法を導き出します。

各ファイル・モジュールでオブジェクトを提供します:輸出の
輸出のデフォルトは空のオブジェクトである
あなたがする必要があるが、すべてのメンバーが輸出オブジェクトへの外部アクセスをマウントする必要が置いてあります

exports.hello = function () {
    console.log('Hello World!');
};

テスト

同じフォルダのテストでは、a.js、b.jsを作成

コンテンツを書かれていました

a.jsコンテンツ:

var bExports = require('./b') //引入b文件处理模块

console.log(bExports.foo) //从require对象中接收到foo属性的值

console.log(bExports.add(10, 30))//从require对象中接收到add函数

console.log(bExports.age)  //未能接收到age属性,所以输出值是undefined

bExports.readFile('./a.js')  //这里执行的是b.js的readFile函数,与fs模块中的
//readFile函数无关

console.log('------分割线-------')

var fs = require('fs')  //引入fs文件处理模块

fs.readFile('./a.js', function (err, data) {
	//执行fs模块的readFile方法
  if (err) {
    console.log('读取文件失败')
  } else {
    console.log(data.toString())
  }
})

b.jsコンテンツ

var foo = 'bbb'

// console.log(exports)

exports.foo = 'hello'

exports.add = function (x, y) {
  return x + y
}

exports.readFile = function (path, callback) {
  console.log('文件路径:', path)
}

var age = 18

// exports.age = age

function add(x, y) {
  return x - y
}

実行a.js、出力

ERROR: The process "node.exe" not found.
hello
40
undefined
文件路径: ./a.js
------分割线-------
var bExports = require('./b') //引入b文件处理模块

console.log(bExports.foo) //从require对象中接收到foo属性的值

console.log(bExports.add(10, 30))//从require对象中接收到add函数

console.log(bExports.age)  //未能接收到age属性,所以输出值是undefined

bExports.readFile('./a.js')  //这里执行的是b.js的readFile函数,与fs模块中的
//readFile函数无关

console.log('------分割线-------')

var fs = require('fs')  //引入fs文件处理模块

fs.readFile('./a.js', function (err, data) {
	//执行fs模块的readFile方法
  if (err) {
    console.log('读取文件失败')
  } else {
    console.log(data.toString())
  }
})

[Finished in 0.4s]

分析:オブジェクトを搭載exports` b.jsを受けてbExports特性及び機能によってa.js、表示が不定されていません

三、HTTPモジュールサプリメント

設定応答ヘッダー

res.setHeader()

var http = require('http')

var server = http.createServer()

server.on('request', function (req, res) {
  // 在服务端默认发送的数据,其实是 utf8 编码的内容
  // 但是浏览器不知道你是 utf8 编码的内容
  // 浏览器在不知道服务器响应内容的编码的情况下会按照当前操作系统的默认编码去解析
  // 中文操作系统默认是 gbk
  // 解决方法就是正确的告诉浏览器我给你发送的内容是什么编码的
  // 在 http 协议中,Content-Type 就是用来告知对方我给你发送的数据内容是什么类型
  // res.setHeader('Content-Type', 'text/plain; charset=utf-8')
  // res.end('hello 世界')

  var url = req.url

  if (url === '/plain') {
    // text/plain 就是普通文本
    res.setHeader('Content-Type', 'text/plain; charset=utf-8')
    //设置响应头
    res.end('hello 世界')
  } else if (url === '/html') {
    // 如果你发送的是 html 格式的字符串,则也要告诉浏览器我给你发送是 text/html 格式的内容
    res.setHeader('Content-Type', 'text/html; charset=utf-8')
    res.end('<p>hello html <a href="">点我</a></p>')
  }
})

server.listen(3000, function () {
  console.log('Server is running...')
})

FSは、httpモジュールと組み合わせてモジュール

(HTTPはFS送信データファイルを結合)ネットワーク経由でファイルを送信:ファイルが送信されていない、ブラウザがサーバーの応答内容を受信したときに、コンテンツファイルの性質に送信され、対応がContent-Typeのように解析されますプロセス

// 1. 结合 fs 发送文件中的数据
// 2. Content-Type
//    http://tool.oschina.net/commons
//    不同的资源对应的 Content-Type 是不一样的
//    图片不需要指定编码
//    一般只为字符数据才指定编码

var http = require('http')
var fs = require('fs')

var server = http.createServer()

server.on('request', function (req, res) {
  // / index.html
  var url = req.url

  if (url === '/') {
    // 肯定不这么干
    // res.end('<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Document</title></head><body><h1>首页</h1></body>/html>')

    // 我们要发送的还是在文件中的内容
    fs.readFile('./resource/index.html', function (err, data) {
      if (err) {
        res.setHeader('Content-Type', 'text/plain; charset=utf-8')
        res.end('文件读取失败,请稍后重试!')
      } else {
        // data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
        // res.end() 支持两种数据类型,一种是二进制,一种是字符串
        res.setHeader('Content-Type', 'text/html; charset=utf-8')
        res.end(data)
      }
    })
  } else if (url === '/xiaoming') {
    // url:统一资源定位符
    // 一个 url 最终其实是要对应到一个资源的
    fs.readFile('./resource/ab2.jpg', function (err, data) {
      if (err) {
        res.setHeader('Content-Type', 'text/plain; charset=utf-8')
        res.end('文件读取失败,请稍后重试!')
      } else {
        // data 默认是二进制数据,可以通过 .toString 转为咱们能识别的字符串
        // res.end() 支持两种数据类型,一种是二进制,一种是字符串
        // 图片就不需要指定编码了,因为我们常说的编码一般指的是:字符编码
        res.setHeader('Content-Type', 'image/jpeg')
        res.end(data)
      }
    })
  }
})

server.listen(3000, function () {
  console.log('Server is running...')
})

四、JavaScriptの標準スタイル(Jsの標準コーディングスタイル)

使用两个空格 – 进行缩进

字符串使用单引号 – 需要转义的地方除外

不再有冗余的变量 – 这是导致 大量 bug 的源头!

行首不要以 (, [, or ` 开头

这是省略分号时唯一会造成问题的地方 – 工具里已加了自动检测!

关键字后加空格 if (condition) { ... }

函数名后加空格 function name (arg) { ... }

坚持使用全等 === 摒弃 == 一但在需要检查 null || undefined 时可以使用 obj == null。

一定要处理 Node.js 中错误回调传递进来的 err 参数。

使用浏览器全局变量时加上 window 前缀 – document 和 navigator 除外

避免无意中使用到了这些命名看上去很普通的全局变量, open, length, event 还有 name。



// 当你采用了无分号的代码风格的时候,只需要注意以下情况就不会有上面的问题了:
//    当一行代码是以:
//        (
//        [
//        `
//        开头的时候,则在前面补上一个分号用以避免一些语法解析错误。
//    所以你会发现在一些第三方的代码中能看到一上来就以一个 ; 开头。
//  结论:
//    无论你的代码是否有分号,都建议如果一行代码是以 (、[、` 开头的,则最好都在其前面补上一个分号。
//    有些人也喜欢玩儿一些花哨的东西,例如可以使用 ! ~ 等。

条件

  • 二つのスペースを使用してインデントします
function hello (name) {
  console.log('hi', name)
}
  • 必要なエスケープ、などを除いた文字列統一単一引用符
console.log('hello there')
$("<div class='box'>")
  • 未使用の変数を残してはいけません
function myFunction () {
  var result = something()   // ✗ avoid
}
  • キーワードスペース
if (condition) { ... }   // ✓ ok
if(condition) { ... }    // ✗ avoid
  • 関数は、関数名空間の括弧の間に宣言されている場合
function name (arg) { ... }   // ✓ ok
function name(arg) { ... }    // ✗ avoid

run(function () { ... })      // ✓ ok
run(function() { ... })       // ✗ avoid
  • 常に==代替使用===

例外:obj == null確認することができますnull || undefined

if (name === 'John')   // ✓ ok
if (name == 'John')    // ✗ avoid

if (name !== 'John')   // ✓ ok
if (name != 'John')    // ✗ avoid
  • 文字列連結演算子(挿入演算子)の間の空間を残します
// ✓ ok
var x = 2
var message = 'hello, ' + name + '!'

// ✗ avoid
var x=2
var message = 'hello, '+name+'!'
  • コンマとスペースの後ろ
// ✓ ok
var list = [1, 2, 3, 4]
function greet (name, options) { ... }

// ✗ avoid
var list = [1,2,3,4]
function greet (name,options) { ... }
  • 他にあなたが同じ行にブレースを維持したいキーワード
// ✓ ok
if (condition) {
  // ...
} else {
  // ...
}

// ✗ avoid
if (condition) {
  // ...
}
else {
  // ...
}
  • マルチラインステートメント場合ブラケットは免れるべきではありません
// ✓ ok
if (options.quiet !== true) console.log('done')

// ✓ ok
if (options.quiet !== true) {
  console.log('done')
}

// ✗ avoid
if (options.quiet !== true)
  console.log('done')
  • プラスウィンドウ。プレフィックスは、グローバル変数のブラウザを使用している場合、

例外:documentconsolenavigator

window.alert('hi')   // ✓ ok
  • これは、複数行の連続空白行を許可していません。
// ✓ ok
var value = 'hello world'
console.log(value)
// ✗ avoid
var value = 'hello world'


console.log(value)
  • そして、三項演算子:?コードのために、彼らは、同じ行の責任であると
// ✓ ok
var location = env.development ? 'localhost' : 'www.api.com'

// ✓ ok
var location = env.development
  ? 'localhost'
  : 'www.api.com'

// ✗ avoid
var location = env.development ?
  'localhost' :
  'www.api.com'
  • 各varキーワードは、単独の変数を宣言します
// ✓ ok
var silent = true
var verbose = true

// ✗ avoid
var silent = true, verbose = true

// ✗ avoid
var silent = true,
    verbose = true
  • コードブロックの単一ラインの両側にスペース
function foo () {return true}    // ✗ avoid
function foo () { return true }  // ✓ ok
  • 変数と関数名のためにラクダ統一命名法を使用します
function my_function () { }    // ✗ avoid
function myFunction () { }     // ✓ ok

var my_var = 'hello'           // ✗ avoid
var myVar = 'hello'            // ✓ ok
  • 行の最後には、余分なコンマを許可していません。
var obj = {
  message: 'hello',   // ✗ avoid
}
  • 常に行のコンマ終止符を打ちます
var obj = {
  foo: 'foo'
  ,bar: 'bar'   // ✗ avoid
}

var obj = {
  foo: 'foo',
  bar: 'bar'   // ✓ ok
}
  • ドット演算子は、プロパティと同じ行以内でなければなりません
  console.
    log('hello')  // ✗ avoid

  console
    .log('hello') // ✓ ok
  • ファイルの末尾に空白行を残します

  • 場合関数呼出し識別子とブラケットとの間に隙間を残すことなく

console.log ('hello') // ✗ avoid
console.log('hello')  // ✓ ok
  • コロンと空白のままにされる値の間のキーと値のペアのうち、
var obj = { 'key' : 'value' }    // ✗ avoid
var obj = { 'key' :'value' }     // ✗ avoid
var obj = { 'key':'value' }      // ✗ avoid
var obj = { 'key': 'value' }     // ✓ ok
  • コンストラクタは大文字で始める必要があります
function animal () {}
var dog = new animal()    // ✗ avoid

function Animal () {}
var dog = new Animal()    // ✓ ok
  • 代わりに、配列リテラルコンストラクタを使用します
var nums = new Array(1, 2, 3)   // ✗ avoid
var nums = [1, 2, 3]            // ✓ ok
  • 宣言のconstを変更した変数を使用しないでください
const score = 100
score = 125       // ✗ avoid
  • (ループを除く)の条件式の条件として、一定の使用を避けます
if (false) {    // ✗ avoid
  // ...
}

if (x === 0) {  // ✓ ok
  // ...
}

while (true) {  // ✓ ok
  // ...
}
  • 完成した使い捨てモジュールは、同一の導入を複数有する場合
import { myFunc1 } from 'module'
import { myFunc2 } from 'module'          // ✗ avoid

import { myFunc1, myFunc2 } from 'module' // ✓ ok
  • ネイティブオブジェクトを拡張しないでください。
Object.prototype.age = 21     // ✗ avoid
  • 割り込み通常の条件分岐にスイッチにブレークを使用してください
switch (filter) {
  case 1:
    doSomething()    // ✗ avoid
  case 2:
    doSomethingElse()
}

switch (filter) {
  case 1:
    doSomething()
    break           // ✓ ok
  case 2:
    doSomethingElse()
}

switch (filter) {
  case 1:
    doSomething()
    // fallthrough  // ✓ ok
  case 2:
    doSomethingElse()
}
  • グローバルな読み取り専用のオブジェクトにない再割り当てを行います
window = {}     // ✗ avoid
  • インデントとスペースとタブを混在させないでください

  • インデントを行うに加えて、複数のスペースを使用しません

const id =    1234    // ✗ avoid
const id = 1234       // ✓ ok
  • 新しいオブジェクトのインスタンスを作成するために、変数のニーズに割り当てられました
new Character()                     // ✗ avoid
const character = new Character()   // ✓ ok
  • Functionコンストラクタの使用を禁止します
var sum = new Function('a', 'b', 'return a + b')    // ✗ avoid
  • Objectコンストラクタの使用を禁止します
let config = new Object()   // ✗ avoid
  • 文字列スプライシングと__filenameの__dirnameの使用は避けてください
const pathToFile = __dirname + '/app.js'            // ✗ avoid
const pathToFile = path.join(__dirname, 'app.js')   // ✓ ok
  • 宣言変数を繰り返さないでください。
let name = 'John'
let name = 'Jane'     // ✗ avoid

let name = 'John'
name = 'Jane'         // ✓ ok
  • 代入return文は、ブラケットをラップしている必要があります
function sum (a, b) {
  return result = a + b     // ✗ avoid
}

function sum (a, b) {
  return (result = a + b)   // ✓ ok
}
  • これらのステートメントの後ろのリターンは、投げ続けると、コードが冗長で破ります
function doSomething () {
  return true
  console.log('never called')     // ✗ avoid
}
  • オペレータ間滞在し、その空白の表現を拡大しないでください。
fn(... args)    // ✗ avoid
fn(...args)     // ✓ ok
  • スペースなしでセミコロンの前には、スペースが残さ
for (let i = 0 ;i < items.length ;i++) {...}    // ✗ avoid
for (let i = 0; i < items.length; i++) {...}    // ✓ ok
  • コードブロックが始まる前にスペースを入れてください
if (admin){...}     // ✗ avoid
if (admin) {...}    // ✓ ok
  • 括弧の間にスペースを残すことなく、
getName( name )     // ✗ avoid
getName(name)       // ✓ ok
  • コメントの前後にスペースを入れてください
//comment           // ✗ avoid
// comment          // ✓ ok

/*comment*/         // ✗ avoid
/* comment */       // ✓ ok
  • テンプレート変数の文字列の前後にスペースありません
const message = `Hello, ${ name }`    // ✗ avoid
const message = `Hello, ${name}`      // ✓ ok
  • NaNは)(正しい姿勢でのisNaNを使用することですチェック
if (price === NaN) { }      // ✗ avoid
if (isNaN(price)) { }       // ✓ ok

セミコロンについて

  • セミコロンを使用しないでください
window.alert('hi')   // ✓ ok
window.alert('hi');  // ✗ avoid
  • 使用しないでください([または、その他の`` `ラインの始まり。いかなる状況下では、エラーコードの圧縮後のセミコロンにつながる、とミスを避けることができ、この規範に準拠しています。
// ✓ ok
;(function () {
  window.alert('ok')
}())

// ✗ avoid
(function () {
  window.alert('ok')
}())
// ✓ ok
;[1, 2, 3].forEach(bar)

// ✗ avoid
[1, 2, 3].forEach(bar)
// ✓ ok
;`hello`.indexOf('o')

// ✗ avoid
`hello`.indexOf('o')

上記の文言は半分だけによってあまりにも賢いと言います

例えば:

;[1, 2, 3].forEach(bar)

提案された文言は次のとおりです。

var nums = [1, 2, 3]
nums.forEach(bar)

参考資料

[1] https://www.jianshu.com/p/e889069b7c27

[2] https://github.com/standard/standard/blob/master/docs/RULES-zhcn.md

おすすめ

転載: www.cnblogs.com/Nicholas0707/p/12571457.html