nodejs (Parte III): nodejs módulo de archivos, en nodejs requiere y las exportaciones, http módulo de complemento, Estilo estándar JavaScript

A, nodejs módulo de archivos

En nodejs, los módulos escritos por el usuario, llamado módulo de archivo .

módulo de archivo, se refiere js, archivos o archivo .node JSON. En la ruta del archivo de referencia cuando el módulo que desee añadir archivos: /.../.../ xxx.js indica una ruta absoluta, / xxx.js representa la ruta relativa (los mismos xxx.js carpeta), .. ./ indican el directorio padre. Si ni más ni /.../,../ más ./, entonces o bien el módulo es el módulo principal, ya sea cargado desde una carpeta de archivos node_modules.

(1) En los Node.js, requieren un método, sólo para script de carga para realizar múltiples archivos JavaScript requieren métodos.

módulos personalizados ruta relativa debe ser escrito. / JS sufijo puede omitirse.

manifestación

En la misma prueba carpeta, cree a.js, b.js

Fueron el contenido escrito

a.js contenido:

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

contenido b.js

console.log('b msg')

a.js de ejecución, la salida

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

Análisis: requiere b.js en el código de carga, el código se ejecuta en el cual

(2) requieren de carga sólo se ejecuta el código, el módulo está aislado del alcance

Debido a que es entre los archivos y el alcance del módulo (sin concepto de alcance global en Node.js), el módulo está completamente cerrado, no puede acceder al ventilador interno externo, interno no puede tener acceso externo.

Prueba 1: Prueba de valor entre el módulo de archivo afectan entre sí o estar cubierto

En la misma prueba carpeta, cree a.js, b.js

Fueron el contenido escrito

a.js contenido:

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

contenido b.js

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

a.js de ejecución, la salida

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

Análisis: Como puede verse a partir de los resultados de salida b.js introducidas entre el módulo y no afecta a los valores a.js foo, el archivo con el ámbito de archivo está aislado de

Prueba 2: llamar al archivo original en el módulo de archivo en el módulo de función introducida en

En la misma prueba carpeta, cree a.js, b.js

Fueron el contenido escrito

a.js contenido:


console.log('a start')

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

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

contenido b.js

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

módulo de función a.js ejecución, el error de ejecución de la producción, no está definido complemento, la función no está definida, el archivo original no se puede hacer referencia

Dos, nodejs de las exportaciones y requieren

exigir

requireFunción se utiliza para cargar y utilizar otros módulos en el módulo actual, pasando en un nombre de módulo, para devolver un módulo para exportar el objeto. Módulo puede utilizar un nombre de trayectoria relativa (en ./principio), o una ruta absoluta ( /o C:el comienzo de la carta o similares). Además, el nombre del módulo .jsde extensión se puede omitir. He aquí un ejemplo.

Hay dos métodos requieren la acción:

  1. Cargar el archivo y ejecutar código dentro del módulo
  2. Obtener el objeto de interfaz es exportada por el archivo de carga del módulo
var foo1 = require('./foo');
var foo2 = require('./foo.js');
var foo3 = require('/home/user/foo');
var foo4 = require('/home/user/foo.js');

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

Además, puede cargar y utilizar un archivo JSON usando el siguiente método.

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

exportaciones

exportsEl objeto se deriva objetos del módulo actual, y un método para derivar propiedades públicas módulo. Otros módulos de requireusar el módulo actual se obtiene cuando la corriente de la función de módulo de exportsobjeto. Derivar un método público del siguiente ejemplo.

En cada módulo de archivos proporciona un objeto: exportaciones
exportaciones por defecto es un objeto vacío
que hay que hacer es poner todos los miembros tienen que montarse el acceso externo al objeto exportaciones

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

prueba

En la misma prueba carpeta, cree a.js, b.js

Fueron el contenido escrito

a.js contenido:

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())
  }
})

contenido 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 de ejecución, la salida

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]

Análisis: a.js por propiedades y funciones bExports por recibir b.js exports` montan objetos, la pantalla no es indefinido

Tres, http módulo de suplementos

Ajuste de cabecera de respuesta

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 módulo en conjunción con http módulo

Enviar un archivo a través de una red (http fs archivo de datos de transmisión de enlace): El archivo no se transmite, se transmiten sobre la naturaleza del archivo de contenido, cuando el navegador recibe el contenido de la respuesta del servidor, la correspondencia se analiza como Content-Type proceso

// 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...')
})

Cuatro, (estilo Js estándar de codificación) JavaScript Estilo Estándar

使用两个空格 – 进行缩进

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

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

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

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

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

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

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

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

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

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



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

condiciones

  • Utilizar dos espacios para sangrar
function hello (name) {
  console.log('hi', name)
}
  • Excepto cuando sea requerido escapado, cuerdas unificados comillas simples
console.log('hello there')
$("<div class='box'>")
  • No deje las variables utilizadas
function myFunction () {
  var result = something()   // ✗ avoid
}
  • Los espacios de palabras clave
if (condition) { ... }   // ✓ ok
if(condition) { ... }    // ✗ avoid
  • Cuando se declara la función entre los paréntesis de los espacios de nombre de la función
function name (arg) { ... }   // ✓ ok
function name(arg) { ... }    // ✗ avoid

run(function () { ... })      // ✓ ok
run(function() { ... })       // ✗ avoid
  • Siempre uso alternativo == ===

Excepción: obj == nullse puede utilizar para comprobarnull || undefined

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

if (name !== 'John')   // ✓ ok
if (name != 'John')    // ✗ avoid
  • operador de concatenación (operadores infijos) para dejar un espacio entre el
// ✓ ok
var x = 2
var message = 'hello, ' + name + '!'

// ✗ avoid
var x=2
var message = 'hello, '+name+'!'
  • Detrás de la coma y el espacio
// ✓ ok
var list = [1, 2, 3, 4]
function greet (name, options) { ... }

// ✗ avoid
var list = [1,2,3,4]
function greet (name,options) { ... }
  • de lo contrario las palabras clave que desea mantener el aparato ortopédico en la misma línea
// ✓ ok
if (condition) {
  // ...
} else {
  // ...
}

// ✗ avoid
if (condition) {
  // ...
}
else {
  // ...
}
  • Multilínea sentencia if paréntesis no se deben escatimar
// ✓ ok
if (options.quiet !== true) console.log('done')

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

// ✗ avoid
if (options.quiet !== true)
  console.log('done')
  • Además ventana. Prefijo se use el explorador de variables globales

Excepción: document, console,navigator

window.alert('hi')   // ✓ ok
  • No permite que múltiples líneas continuas líneas en blanco
// ✓ ok
var value = 'hello world'
console.log(value)
// ✗ avoid
var value = 'hello world'


console.log(value)
  • Y para el operador ternario :? código con el que ellos son los responsables de la misma fila
// ✓ 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'
  • Cada palabra clave var sola declarar una variable
// ✓ ok
var silent = true
var verbose = true

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

// ✗ avoid
var silent = true,
    verbose = true
  • Espacios a ambos lados de una sola línea de bloques de código
function foo () {return true}    // ✗ avoid
function foo () { return true }  // ✓ ok
  • Para los nombres de variables y funciones camello utilizar la nomenclatura unificada
function my_function () { }    // ✗ avoid
function myFunction () { }     // ✓ ok

var my_var = 'hello'           // ✗ avoid
var myVar = 'hello'            // ✓ ok
  • Extremo de la línea no permite coma adicional
var obj = {
  message: 'hello',   // ✗ avoid
}
  • Siempre ponga un extremo de la línea coma
var obj = {
  foo: 'foo'
  ,bar: 'bar'   // ✗ avoid
}

var obj = {
  foo: 'foo',
  bar: 'bar'   // ✓ ok
}
  • operador punto debe estar dentro de la misma línea con las propiedades
  console.
    log('hello')  // ✗ avoid

  console
    .log('hello') // ✓ ok
  • Deje una línea en blanco al final del archivo

  • Cuando la llamada a la función sin dejar un hueco entre el identificador y los soportes

console.log ('hello') // ✗ avoid
console.log('hello')  // ✓ ok
  • Entre pares de valores clave entre los dos puntos y el valor a ser dejado en blanco
var obj = { 'key' : 'value' }    // ✗ avoid
var obj = { 'key' :'value' }     // ✗ avoid
var obj = { 'key':'value' }      // ✗ avoid
var obj = { 'key': 'value' }     // ✓ ok
  • El constructor debe comenzar con una letra mayúscula
function animal () {}
var dog = new animal()    // ✗ avoid

function Animal () {}
var dog = new Animal()    // ✓ ok
  • En lugar de utilizar el constructor literal array
var nums = new Array(1, 2, 3)   // ✗ avoid
var nums = [1, 2, 3]            // ✓ ok
  • Evitar el uso de variables modificadas declarado const
const score = 100
score = 125       // ✗ avoid
  • Evitar el uso de una constante como una condición de la expresión condicional (circular excluido)
if (false) {    // ✗ avoid
  // ...
}

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

while (true) {  // ✓ ok
  // ...
}
  • Cuando el módulo desechable acabado tiene una pluralidad de misma introducción
import { myFunc1 } from 'module'
import { myFunc2 } from 'module'          // ✗ avoid

import { myFunc1, myFunc2 } from 'module' // ✓ ok
  • No extienda objetos nativos
Object.prototype.age = 21     // ✗ avoid
  • Asegúrese de utilizar la pausa para cambiar a salto condicional normal de interrupción
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()
}
  • No vuelva a la asignación a un mundial objetos de sólo lectura
window = {}     // ✗ avoid
  • No mezclar los espacios y las pestañas como guiones

  • Además de guión No utilice varios espacios

const id =    1234    // ✗ avoid
const id = 1234       // ✓ ok
  • Asignado a las necesidades variables para crear la nueva instancia de objeto
new Character()                     // ✗ avoid
const character = new Character()   // ✓ ok
  • Prohibir el uso del constructor de funciones
var sum = new Function('a', 'b', 'return a + b')    // ✗ avoid
  • Prohibir el uso del constructor Object
let config = new Object()   // ✗ avoid
  • Evitar el uso de cuerdas y empalme __dirname __filename
const pathToFile = __dirname + '/app.js'            // ✗ avoid
const pathToFile = path.join(__dirname, 'app.js')   // ✓ ok
  • No repetir las variables de declarar
let name = 'John'
let name = 'Jane'     // ✗ avoid

let name = 'John'
name = 'Jane'         // ✓ ok
  • instrucción de retorno asignación debe haber envuelto soportes
function sum (a, b) {
  return result = a + b     // ✗ avoid
}

function sum (a, b) {
  return (result = a + b)   // ✓ ok
}
  • A cambio, detrás de estas declaraciones arrojan, continuar y romper el código es redundante
function doSomething () {
  return true
  console.log('never called')     // ✗ avoid
}
  • No se quede entre el operador y ampliado su expresión en blanco
fn(... args)    // ✗ avoid
fn(...args)     // ✓ ok
  • Delante del punto y coma sin espacios, espacios dejados atrás
for (let i = 0 ;i < items.length ;i++) {...}    // ✗ avoid
for (let i = 0; i < items.length; i++) {...}    // ✓ ok
  • Dejar un espacio antes de que comience el bloque de código
if (admin){...}     // ✗ avoid
if (admin) {...}    // ✓ ok
  • Sin dejar espacios entre paréntesis
getName( name )     // ✗ avoid
getName(name)       // ✓ ok
  • Dejar un espacio antes y después de los comentarios
//comment           // ✗ avoid
// comment          // ✓ ok

/*comment*/         // ✗ avoid
/* comment */       // ✓ ok
  • Sin espacios antes y después de la cadena variable de plantilla
const message = `Hello, ${ name }`    // ✗ avoid
const message = `Hello, ${name}`      // ✓ ok
  • NaN verificar la postura correcta es utilizar el isNaN ()
if (price === NaN) { }      // ✗ avoid
if (isNaN(price)) { }       // ✓ ok

Acerca de punto y coma

  • No utilice un punto y coma
window.alert('hi')   // ✓ ok
window.alert('hi');  // ✗ avoid
  • No utilice el (, [o y otra `` `principio de la línea. Bajo ninguna circunstancia dará lugar a un punto y coma después de la compresión de código de error, y se adhieran a esta norma puede evitar cometer errores.
// ✓ 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')

La redacción anterior sólo decir demasiado listo

Por ejemplo:

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

La redacción propuesta es:

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

material de referencia

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

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

Supongo que te gusta

Origin www.cnblogs.com/Nicholas0707/p/12571457.html
Recomendado
Clasificación