導入
Node.js 開発者であれば、おそらく cjs モジュールと esm モジュールについて聞いたことがあるでしょうが、なぜ 2 つあるのか、Node.js アプリケーションでこれらがどのように共存するのかはよくわからないかもしれません。このブログ投稿では、Node.js の JavaScript モジュールの歴史を簡単に説明します (例付き ?)。これにより、これらの概念をより自信を持って扱うことができます。
グローバルスコープ
当初、JavaScript にはグローバル スコープのみがあり、すべてのメンバーが宣言されていました。 2 つの独立したファイルがメンバーに同じ名前を使用する可能性があるため、コードを共有する場合、これは問題でした。例:
greet-1.js
function greet(name) { return `Hello ${name}!`; }
greet-2.js
var greet = "...";
index.html
<meta charset="utf-8"> <title>Collision example</title> <!-- After this script, `greet` is a function --> <script src="greet-1.js"></script> <!-- After this script, `greet` is a string --> <script src="greet-2.js"></script> <script> // TypeError: "greet" is not a function greet(); </script>
CommonJS モジュール
Node.js は、CommonJS (cjs とも呼ばれる) を使用した JavaScript モジュールの概念を正式に導入しました。これにより、開発者が何をエクスポートするか (module.exports 経由)、何をインポートするか (require() 経由) を決定できるため、共有グローバル スコープの衝突問題が解決されました。例:
src/greet.js
// this remains "private" const GREETING_PREFIX = "Hello"; // this will be exported function greet(name) { return `${GREETING_PREFIX} ${name}!`; } // `exports` is a shortcut to `module.exports` exports.greet = greet;
src/main.js
// notice the `.js` suffix is missing const { greet } = require("./greet"); // logs: Hello Alice! console.log(greet("Alice"));
npmパッケージ
Node.js 開発は、開発者が再利用可能な JavaScript コードを公開および利用できるようにした npm パッケージのおかげで人気が爆発的に高まりました。 npm パッケージは、デフォルトでは、node_modules フォルダーにインストールされます。すべての npm パッケージに存在する package.json ファイルは、「main」プロパティを介してどのファイルがエントリ ポイントである Node.js を示すことができるため、特に重要です。例:
node_modules/greeter/package.json
{ "name": "greeter", "main": "./entry-point.js" // ... }
node_modules/greeter/entry-point.js
module.exports = { greet(name) { return `Hello ${name}!`; } };
src/main.js
// notice there's no relative path (e.g. `./`) const { greet } = require("greeter"); // logs: Hello Bob! console.log(greet("Bob"));
バンドラー
npm パッケージは、他の開発者の作業を活用できるため、開発者の生産性が劇的に向上しました。ただし、cjs は Web ブラウザと互換性がないという大きな欠点がありました。この問題を解決するために、バンドラーの概念が生まれました。 browserify は、基本的にエントリ ポイントをトラバースし、require() で処理されたすべてのコードを Web ブラウザと互換性のある単一の .js ファイルに「バンドル」することで機能する最初のバンドラーでした。時間が経つにつれて、追加の機能と差別化要因を備えた他のバンドラーが導入されました。最も注目すべきは、webpack、parcel、rollup、esbuild、vite (時系列順)。
ECMAScript モジュール
Node.js および cjs モジュールが主流になるにつれて、ECMAScript 仕様の管理者はモジュールの概念を含めることを決定しました。これが、ネイティブ JavaScript モジュールが ESModules または esm (ECMAScript モジュールの略) とも呼ばれる理由です。
esm は、メンバーをエクスポートおよびインポートするための新しいキーワードと構文を定義し、デフォルトのエクスポートなどの新しい概念を導入します。時間が経つにつれ、esm モジュールには動的 import() やトップレベルの await などの新しい機能が追加されました。例:
src/greet.js
function greet(name) { return `Hello ${name}!`; }
src/part.js
var greet = "...";
src/main.js
<meta charset="utf-8"> <title>Collision example</title> <!-- After this script, `greet` is a function --> <script src="greet-1.js"></script> <!-- After this script, `greet` is a string --> <script src="greet-2.js"></script> <script> // TypeError: "greet" is not a function greet(); </script>
esm は、esm 構文を cjs に変換できるため、バンドラーや TypeScript などの言語のおかげで、開発者に広く採用されるようになりました。
Node.js cjs/esm の相互運用性
需要の高まりにより、Node.js はバージョン 12.x で正式に esm のサポートを追加しました。 cjs との下位互換性は次のように実現されました:
- Node.js は、package.json が「type」プロパティを「module」に設定しない限り、.js ファイルを cjs モジュールとして解釈します。
- Node.js は .cjs ファイルを cjs モジュールとして解釈します。
- Node.js は .mjs ファイルを esm モジュールとして解釈します。
npm パッケージの互換性に関しては、esm モジュールは cjs および esm エントリ ポイントを使用して npm パッケージをインポートできます。ただし、その逆にはいくつかの注意点があります。次の例を見てみましょう:
node_modules/cjs/package.json
// this remains "private" const GREETING_PREFIX = "Hello"; // this will be exported function greet(name) { return `${GREETING_PREFIX} ${name}!`; } // `exports` is a shortcut to `module.exports` exports.greet = greet;
node_modules/cjs/entry.js
// notice the `.js` suffix is missing const { greet } = require("./greet"); // logs: Hello Alice! console.log(greet("Alice"));
node_modules/esm/package.json
{ "name": "greeter", "main": "./entry-point.js" // ... }
node_modules/esm/entry.js
module.exports = { greet(name) { return `Hello ${name}!`; } };
以下は問題なく動作します:
src/main.mjs
// notice there's no relative path (e.g. `./`) const { greet } = require("greeter"); // logs: Hello Bob! console.log(greet("Bob"));
ただし、次のコマンドは実行できません:
src/main.cjs
// this remains "private" const GREETING_PREFIX = "Hello"; // this will be exported export function greet(name) { return `${GREETING_PREFIX} ${name}!`; }
これが許可されない理由は、esm モジュールではトップレベルの await が許可されるのに対し、require() 関数は同期であるためです。コードは動的 import() を使用するように書き直すこともできますが、Promise を返すため、次のようなものにする必要があります:
src/main.cjs
// default export: new concept export default function part(name) { return `Goodbye ${name}!`; }
この互換性の問題を軽減するために、一部の npm パッケージは、条件付きエクスポートで package.json の "exports" プロパティを利用することにより、cjs と mjs の両方のエントリ ポイントを公開します。例:
node_modules/esm/entry.cjs:
// notice the `.js` suffix is required import part from "./part.js"; // dynamic import: new capability // top-level await: new capability const { greet } = await import("./greet.js"); // logs: Hello Alice! console.log(greet("Alice")); // logs: Bye Bob! console.log(part("Bob"));
node_modules/esm/package.json:
{ "name": "cjs", "main": "./entry.js" }
「exports」プロパティをサポートしていない Node.js バージョンとの下位互換性のために、「main」が cjs バージョンをどのように指しているかに注目してください。
結論
cjs および esm モジュールについて知っておく必要があるのは (ほぼ) これだけです (2024 年 12 月時点?)。以下からご意見をお聞かせください!
以上がNode.js: CJS、バンドラー、ESM の簡単な歴史の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

JavaScriptコアデータ型は、ブラウザとnode.jsで一貫していますが、余分なタイプとは異なる方法で処理されます。 1)グローバルオブジェクトはブラウザのウィンドウであり、node.jsのグローバルです2)バイナリデータの処理に使用されるNode.jsの一意のバッファオブジェクト。 3)パフォーマンスと時間の処理にも違いがあり、環境に従ってコードを調整する必要があります。

javascriptusestwotypesofcomments:シングルライン(//)およびマルチライン(//)

PythonとJavaScriptの主な違いは、タイプシステムとアプリケーションシナリオです。 1。Pythonは、科学的コンピューティングとデータ分析に適した動的タイプを使用します。 2。JavaScriptは弱いタイプを採用し、フロントエンドとフルスタックの開発で広く使用されています。この2つは、非同期プログラミングとパフォーマンスの最適化に独自の利点があり、選択する際にプロジェクトの要件に従って決定する必要があります。

PythonまたはJavaScriptを選択するかどうかは、プロジェクトの種類によって異なります。1)データサイエンスおよび自動化タスクのPythonを選択します。 2)フロントエンドとフルスタック開発のためにJavaScriptを選択します。 Pythonは、データ処理と自動化における強力なライブラリに好まれていますが、JavaScriptはWebインタラクションとフルスタック開発の利点に不可欠です。

PythonとJavaScriptにはそれぞれ独自の利点があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1. Pythonは、データサイエンスやバックエンド開発に適した簡潔な構文を備えた学習が簡単ですが、実行速度が遅くなっています。 2。JavaScriptはフロントエンド開発のいたるところにあり、強力な非同期プログラミング機能を備えています。 node.jsはフルスタックの開発に適していますが、構文は複雑でエラーが発生しやすい場合があります。

javascriptisnotbuiltoncorc;それは、解釈されていることを解釈しました。

JavaScriptは、フロントエンドおよびバックエンド開発に使用できます。フロントエンドは、DOM操作を介してユーザーエクスペリエンスを強化し、バックエンドはnode.jsを介してサーバータスクを処理することを処理します。 1.フロントエンドの例:Webページテキストのコンテンツを変更します。 2。バックエンドの例:node.jsサーバーを作成します。

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

SublimeText3 英語版
推奨: Win バージョン、コードプロンプトをサポート!

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

Dreamweaver Mac版
ビジュアル Web 開発ツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター
