Teknologian jakaminen

JS [yksityiskohtainen selitys] ES6-moduulispesifikaatio vs. CommonJS-moduulispesifikaatio

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Jokainen js-tiedosto on moduuli, ja CommonJS-moduulimääritykset otetaan käyttöön oletuksena.

Uusi ES6-moduuli pk perinteinen CommonJS-moduuli

ominaisuusCommonJSES6 Modulaarisuus
Viedäexports esineexport Avainsanat
tuontirequire()toimintoimport Avainsanat
lataustilaSynkronoidaasynkroninen
suoritustilaSingletonSingleton
Riippuvuudetstaattinendynaaminen
Puun muoto täriseeei tuetuki

lataustila

  • CommonJS on synkroninen, koodin suoritus pysähtyy, kunnes moduuli ladataan.
  • ES6-moduulit ovat asynkronisia, koodi voi jatkaa suorittamista, kun moduuli ladataan myöhemmin.

suoritustila

Sekä CommonJS- että ES6-moduulien suoritus on yksittäinen: moduuli ladataan vain kerran, ja kaikki viittaukset moduuliin osoittavat samaan ilmentymään.

Riippuvuudet

  • CommonJS on staattinen ja moduulien riippuvuudet määritetään käännöshetkellä.
  • ES6-moduulit ovat dynaamisia ja moduulien riippuvuudet määritetään ajon aikana

Puun muoto tärisee

Optimointitekniikka käyttämättömän koodin poistamiseen JavaScript-nipuista.

  • CommonJS ei tue puun tärinää, ja myös käyttämätön koodi moduuleissa ladataan.
  • ES6-modulaarisuus tukee puun tärinää, joka poistaa automaattisesti käyttämättömän koodin paketin koon pienentämiseksi.

Kolme tapaa ottaa käyttöön ES6-moduulit

  1. Aseta paketti.json-tiedostossa "type": "module", joten Node.js käsittelee kaikkia .js-tiedostoja ES6-moduuleina.
  2. Muuta tiedostopääte muotoon .mjs, jotta Node.js käsittelee sitä automaattisesti ES6-moduulina.
  3. Lisää komentosarjatunniste type="module" Attribuutit

ES6-moduulin syntaksi

oletus vienti tuonti vienti oletus

Jokaisella moduulilla voi olla vain yksi oletusvienti

let a = 1
// 默认导出 a
export default a
  • 1
  • 2
  • 3
// 导入默认时,可以命其他名称
import b from './demo.js'

console.log(b)
  • 1
  • 2
  • 3
  • 4

Funktiolausekkeita/anonyymejä funktioita voidaan käyttää suoraan oletusvientinä

export default function myFunc() {}
  • 1
export default function() {}
  • 1

Vie ja tuo useita vientiä { }

let a = 1
let b = 2

export { a, b }
  • 1
  • 2
  • 3
  • 4
// 导入多项时,必须与导出名对应
import { a, b } from './demo.js'

console.log(a, b)
  • 1
  • 2
  • 3
  • 4

Nimeä uudelleen kuten vietäessä

let a = 1
let b = 2

export { a as c, b as d }
  • 1
  • 2
  • 3
  • 4
// 导入时,只能导入新的名称
import { c, d } from './demo.js'

console.log(c, d)
  • 1
  • 2
  • 3
  • 4

Vie muut moduulin tiedot

export { name1, name2, ... } from 'module-name'
  • 1

Tuo kaikki moduulin tuonti *

export let a = 1;
export let b = 2;
  • 1
  • 2
// 通过 as 重命名为一个变量(值为对象)
import * as myModule from "./demo.mjs";

console.log(myModule.a);
console.log(myModule.b);
  • 1
  • 2
  • 3
  • 4
  • 5

Nimeä uudelleen kuten tuonnin yhteydessä

import {trunc as StringLib} from "../lib/string.js"
import {trunc as MathLib} from "../lib/math.js"
  • 1
  • 2

Tuo tiedostot json-muodossa

import pkg from "./package.json" assert { type: "json" };
  • 1
const { default: jsonObject } = await import('./file.json', {
  assert: {
    type: 'json'
  }
});
  • 1
  • 2
  • 3
  • 4
  • 5

Tuo CommonJS-moduuli

import * as 自定义名称  from '模块名称'
  • 1

CommonJS-moduulin syntaksi

  • Jokaisessa moduulissa on moduuliobjekti, jolla on attribuuttien vienti (attribuutin arvo on myös objekti)
  • Kun tuodaan request(:n) kautta, viedään viedyn moduulin moduuliobjektin vientimäärite.
  • Älä sekoita samassa moduulissa vientiä ja module.export-tiedostoja eri sisällön viemiseksi, koska tämä voi johtaa sekaannukseen ja arvaamattomaan toimintaan.

Vie ja tuo yhden tuotteen module.exports

Viedä

module.exports = "朝阳";
  • 1

tuonti

const demoModule = require("./demo.js");

console.log(demoModule); // 朝阳
  • 1
  • 2
  • 3

Vie ja tuo useita vientituotteita

Viedä

exports.a = 1;
exports.b = 2;
  • 1
  • 2

tuonti

const demoModule = require("./demo.js");

console.log(demoModule); // { a: 1, b: 2 }
  • 1
  • 2
  • 3