mjs vs cjs dengan Gelung Acara

WBOY
Lepaskan: 2024-09-04 16:39:32
asal
997 orang telah melayarinya

pengenalan

Helo Fellow Dev!

Hari ini, kita akan membincangkan perbezaan antara .mjs (modul ECMAScript) dan .cjs (modul CommonJS) dalam Node.js. Walaupun rangka kerja moden seperti React, Next.js dan Vue sering mengendalikan sokongan modul secara automatik, memahami perbezaan ini adalah penting apabila bekerja dengan Node.js secara langsung, terutamanya berkaitan gelung acara dan susunan pelaksanaan.

Matlamat utama saya untuk perbincangan ini adalah ke arah gelung acara dan dalam bahagian seterusnya, kita akan melihat beberapa kes.

Maklumat Asas

mjs (modul ECMAScript) menyokong,

import fs from 'fs'
import https from 'https'
Salin selepas log masuk

cjs (Modul CommonJS) menyokong

const fs = require('fs')
const https = require('https')
Salin selepas log masuk

Gelung Acara dan Perintah Pelaksanaan

Gelung acara Node.js memproses baris gilir yang berbeza dengan peranan dan keutamaan tertentu. Dua fungsi penting yang mempengaruhi susunan pelaksanaan ialah process.nextTick() dan setImmediate() dan kami menggunakan ini dari semasa ke semasa.

process.nextTick vs setImmediate

Jika anda tahu perbezaan antara process.nextTick vs setImmediate itu bagus jika tidak, idea yang sangat asas

process.nextTick memastikan bahawa sekeping kod berjalan selepas fungsi semasa tetapi sebelum sebarang operasi I/O tak segerak.

setImmediate menjadualkan fungsi panggil balik untuk dilaksanakan dalam lelaran seterusnya bagi gelung acara, selepas sebarang acara I/O.

Jadi kod semasa -> process.nextTick -> sebarang operasi I/O -> setSegera

Contoh Kod

Mari kita periksa coretan kod yang menunjukkan susunan pelaksanaan:

//In case of mjs
import https from "https";
import fs from "fs";

//In case of cjs
const https = require("https");
const fs = require("fs");

setImmediate(() => {
    console.log("setImmediate callback");
});

process.nextTick(() => {
    console.log("nextTick callback");
});

fs.readFile("./async.cjs", (err, data) => {
    console.log("file IO Callback");
});

fs.readdir(process.cwd(), () => console.log("file IO Callback 2"));

https.get("https://www.google.com", (res) => {
    console.log("https callback");
});

setImmediate(() => {
    console.log("setImmediate callback 2");
});

Promise.resolve().then(() => {
    console.log("Promise Callback");
});

process.nextTick(() => {
    console.log("Process nextTick console");
    process.nextTick(() => {
        console.log("Process nextTick console 2");
        process.nextTick(() => {
            console.log("Process nextTick console 3");
            process.nextTick(() => {
                console.log("Process nextTick console 4");
            });
        });
    });
});

Promise.resolve().then(() => {
    console.log("Promise Callback 2");
});

console.log("Main thread mjs");

Promise.resolve().then(() => {
    console.log("Promise Callback 3");
});
Salin selepas log masuk

Perintah Perlaksanaan Jangkaan vs Sebenar

Kod harus dijalankan dan dilaksanakan dengan cara ini

  • Urut utama
  • Janjikan panggilan balik
  • panggilan balik NextTick
  • tetapkan panggilan balik segera
  • Panggil balik dan output I/O sepatutnya
Main thread mjs
Promise Callback
Promise Callback 2
Promise Callback 3
nextTick callback
Process nextTick console
Process nextTick console 2
Process nextTick console 3
Process nextTick console 4
setImmediate callback
setImmediate callback 2
file IO Callback
file IO Callback 2
https callback
Salin selepas log masuk

Tetapi adakah ia berlaku dengan mjs?
Tidak Betul!

Ini ialah output wrt mjs dan cjs

mjs vs cjs with Event Loop

Sama seperti process.nextTick dan setImmediate, kita boleh melihat tingkah laku yang sama dengan Promises juga.

sebab apa?

Nampaknya, perbezaan dalam tingkah laku yang kami perhatikan antara fail mjs (modul ECMAScript) dan cjs (modul CommonJS) berkenaan setImmediate dan process.nextTick adalah disebabkan oleh cara Node.js mengendalikan gelung acara dan tugas mikro dalam sistem modul yang berbeza .

Untuk ESM (.mjs):

  • Dalam ESM, Node.js menggunakan pendekatan berbeza untuk mengendalikan pelaksanaan modul utama.
  • Kod modul utama dibalut dengan fungsi tak segerak, yang kemudiannya dilaksanakan.
  • Ini menyebabkan setImmediate panggilan balik dijadualkan untuk lelaran seterusnya bagi gelung acara, selepas semua tugasan mikro (termasuk process.nextTick dan Janji) telah diproses.

Untuk CommonJS (.cjs):

  • Dalam CommonJS, kod modul utama dilaksanakan secara serentak.
  • Ini bermakna panggil balik setImmediate dijadualkan serta-merta dan boleh dijalankan sebelum beberapa tugasan mikro jika ia beratur cukup awal.

Kelakuan Rangka Kerja

Saya telah menguji gelagat ini dalam apl Express dan Nextjs (mod dev) dan menariknya, Express berkelakuan seperti cjs dan Nextjs berkelakuan seperti mjs . Set log pertama adalah daripada Express dan seterusnya daripada Nextjs

mjs vs cjs with Event Loop

Kesimpulan

Memahami perbezaan dalam susunan pelaksanaan antara fail .mjs dan .cjs adalah penting apabila bekerja secara langsung dengan Node.js. Saya harap, ini akan membantu anda memahami perbezaan dan pelaksanaan fail wrt fungsi ini, sedikit lebih baik. Jadi lain kali apabila anda bermain atau mencuba fungsi ini dalam apl anda, ingat perkara ini :)

Untuk contoh lain, sila rujuk dokumentasi rasmi Node.js tentang perbezaan antara modul ES dan pelaksanaan fail CommonJS.

Atas ialah kandungan terperinci mjs vs cjs dengan Gelung Acara. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!