Red de conocimiento informático - Conocimiento informático - Cómo hacer que el nodo ejecute el archivo del módulo es6 y explicación detallada de su principio

Cómo hacer que el nodo ejecute el archivo del módulo es6 y explicación detallada de su principio

La última versión de node admite casi todas las funciones de la última versión de ECMAScript, pero hay una característica que no ha sido compatible hasta ahora, y es el mecanismo de modularidad definido desde ES2015. Hoy en día, muchos de nuestros proyectos utilizan especificaciones modulares de es6 para escribir código, incluidos los proyectos de nodo. Por lo tanto, será muy inconveniente si el nodo no puede ejecutar archivos de módulo es6.

Hay dos formas de permitir que el nodo ejecute archivos del módulo es6:

Convertir el módulo es6 en un módulo commonjs

Enganchar el mecanismo require del nodo y permitir directamente que el nodo requiera la importación de cargas /export

1. Convertir módulo es6 a módulo commonjs

Debido a que el nodo admite casi toda la sintaxis excepto importar/exportar, solo necesitamos convertir importar/exportar codificado en requerir/exportar sin transcodificar. otra sintaxis.

Por ejemplo, el siguiente proyecto:

- paquete.json

- src/

- index.js

- print.js

- ...

# paquete.json

{

"main": "lib /index .js" # La herramienta transcodifica los archivos fuente en el directorio src al directorio lib

}

# src/index.js

importar imprimir from '. /print';

print('index');

exportar impresión predeterminada;

# src/print.js

exportar default str =gt; {

console.log('print: ' str);

};

Porque los archivos fuente en src Todos los directorios son modulares y estandarizados es6, el nodo no puede ejecutarse directamente, por lo que debe transcodificarse al código estandarizado de commonjs.

Hay dos opciones para este proceso:

Si no usa un archivo en el directorio src solo, sino que solo usa src/index.js como archivo de entrada, puede utilizar Los archivos en el directorio src se empaquetan en un archivo en lib/index.js: de esta manera, se recomienda usar el paquete acumulativo de herramientas

si necesita usar los archivos en el directorio src por separado , debe combinar los archivos en el directorio src. Transcodificación uno a uno al directorio lib: de esta manera, se recomienda usar la herramienta gulp babel

1.1 Use rollup para empaquetar los archivos. en el directorio src en un archivo y envíelo a lib/index.js

Archivos relacionados:

# rollup.config.js

exportar valor predeterminado {

entrada: 'src/index.js',

salida: {

archivo: 'lib/index.js',

formato: 'cjs',

},

};

# paquete.json

{

"scripts": {

"build": "rollup -c"

},

"devDependencies": {

" rollup": "^0.66.4"

}

}

Ejecutar comando:

npm run build

Resultado:

# lib/index.js

'use estricto';

var print = str =gt {

console.log('imprimir: ' str);

};

print('index');

módulo.exports = imprimir;

1.2 Utilice gulp babel para transcodificar los archivos del directorio src uno a uno al directorio lib

Archivos relacionados:

# build.js

const gulp = require('gulp');

const babel = require('gulp-babel');

gulp.task('babel', () = gt;

gulp.src('src/**/*.js ')

.pipe(babel({

complementos: ['@babel /plugin-transform-modules-commonjs']

}))

.pipe(gulp.dest('lib'))

);

gulp.series('babel')();

# paquete.json

{

"scripts": {

"build": "node build.js"

} ,

"devDependencies": {

"@babel/core": " ^7.1.2",

"@babel/plugin-transform-modules -commonjs":

"^7.2.0",

"gulp": "^4.0.0",

"gulp-babel": "^8.0.0"

}

}

Ejecutar comando:

npm run build

Resultado:

# lib/index .js

"use estricto";

Object.defineProperty(exports, "__esModule", {

valor: true

} );

exportaciones.default = void 0;

var _print = _interopRequireDefault(require("./print"));

función _interopRequireDefault(obj) { return obj & obj.__esModule ? obj : { predeterminado: obj };

(0, _print.default)('index');

var _default = _print. default;

exports.default = _default;

# lib/print.js

"use estricto";

Objeto .defineProperty (exportaciones, "__esModule", {

valor: true

});

exports.default = void 0;

var _default = str =gt; {

console.log('print: ' str);

};

exportaciones.default = _default;

2. Enganche el mecanismo require del nodo y cargue directamente la importación/exportación

Este mecanismo generalmente consiste en enganchar el mecanismo require del nodo, secuestrar el código del archivo fuente capturado por require y después de que el código fuente sea transcodificado a especificaciones commonjs, luego se envía al flujo de código original del mecanismo requerido.

Los paquetes npm de terceros, como los piratas, proporcionan esta función de agregar ganchos.

babel-register utiliza este método para lograr el propósito de que el nodo ejecute archivos de módulo es6.

2.1 Utilice babel-register para ejecutar archivos del módulo es6 directamente

Directorio de ejemplo:

- paquete.json

- src/< / p>

- Entry.js # Aquí hay un archivo de entrada adicional, que se utiliza específicamente para registrar babel-register

- index.js

- print.js

- ...

Archivos relacionados:

# paquete.json

{

"scripts": {

"run": "node src/entry.js"

},

"devDependencies": {

"@babel /core ": "^7.1.2",

"@babel/plugin-transform-modules-commonjs": "^7.2.0",

"@babel/register ": "^7.0.0"

}

}

# src/entry.js # El archivo de entrada debe escribirse usando especificaciones commonjs porque el gancho aún no se ha registrado

require('@babel/register')({

complementos: ['@babel/plugin-transform-modules-commonjs']

}) ;

require('./index');

# src/index.js

importar impresión desde './print' ;

print('index');

# src/print.js

exportar str predeterminado =gt {

consola; .log('print : ' str);

};

Ejecutar:

npm run run

Resultado:

# Impresión de línea de comando

print: index

Este método provocará una pérdida de rendimiento adicional debido a la transcodificación intermedia, por lo que no se recomienda su uso en un entorno de producción. Sólo se recomienda su uso en modo de desarrollo.

2.2 Utilice babel-node para ejecutar archivos de módulos es6 directamente

babel-node encapsula babel-register y proporciona una forma conveniente de ejecutar archivos de módulos es6 directamente en la línea de comandos.

Directorio de ejemplo:

- paquete.json

- src/

- index.js

- print.js

- ...

Archivos relacionados:

# paquete.json

{

"scripts": {

"run": "babel-node src/index.js --plugins @babel/plugin-transform-modules-commonjs"

}, p>

"devDependencies": {

"@babel/core": "^7.1.2",

"@babel/node": "^7.2 .0 ",

"@babel/plugin-transform-modules-commonjs": "^7.2.0"

}

}

# src/index.js

importar impresión desde './print';

print('index');

# src/print .js

exportar str predeterminado =gt {

console.log('print: ' str);

};

Ejecutar:

npm run run

Resultado:

# Impresión de línea de comando

imprimir: índice

Esto manera Tampoco se recomienda su uso en entornos de producción, solo se recomienda su uso en modo de desarrollo.

3. Enlace

es6 se refiere a ECMAScript 2015

es7 se refiere a ECMAScript 2016

es8 se refiere a ECMAScript 2017

es9 se refiere a ECMAScript 2018

Al momento de escribir este artículo, se ha lanzado ECMAScript 2018.