検索
ホームページウェブフロントエンドjsチュートリアルJavaScript におけるモジュール理解の例

JavaScript におけるモジュール理解の例

Oct 31, 2017 am 09:42 AM
javascriptjsモジュラー

元の時代: script タグは javascriptfiles

-------- html -------
<p id="result"></p>
<script type="text/javascript" src="add.js"></script>
<script type="text/javascript" src="sum.js"></script>
<script type="text/javascript" src="main.js"></script>
-------add.js------
function add(a, b){ return a + b ;}
------ sum.js -----
function sum(n){
   return n + add(1, 2);
}
----- main.js ----
document.getElementById(&#39;result&#39;).innerHTML = sum(3);

を導入します。このメソッドには依存関係の分析が欠けており、グローバル変数空間を汚染し、ファイルが導入される順序を保証する必要があるため、管理が混乱します。モジュールオブジェクトと IIFE モード

モジュールオブジェクトを使用し、すぐに呼び出される関数式

(IIFE)により、グローバルスコープの汚染を減らすことができます。このアプローチでは、オブジェクトをグローバル スコープに公開するだけです。このオブジェクトには、アプリケーションで必要なすべてのメソッドと値が含まれています。

例如只向全局作用域公开了 App 对象
-------- html -------
<p id="result"></p>
<script type="text/javascript" src="app.js"></script>
<script type="text/javascript" src="add.js"></script>
<script type="text/javascript" src="sum.js"></script>
<script type="text/javascript" src="main.js"></script>
------- app.js -------
var App = {};
------- add.js -------
(function(){
    App.add = function(a, b){
       return a + b;
   }
})();
------- sum.js -------
(function(){
    App.sum= function(n){
       return App.add(1, 2) + n;
   }
})();
------- main.js -------
(function(app){
   document.getElementById(&#39;result&#39;).innerHTML = app.sum(3);
})(App);
app.js を除いて、他のすべてのファイルが IIFE 形式にカプセル化されていることがわかります

依存関係の解決が不足しているという問題がまだあり、すべてのグローバル変数が削除されるのではなく、依然として 1 つのグローバル変数が存在します

暫定元号: CommonJS

CommonJS は JavaScript ライブラリではありません。それは標準化団体です。 ECMA や W3C のようなものです。 ECMA は JavaScript 言語仕様を定義します。 W3C は、DOM や DOM イベントなどの JavaScript Web API を定義します。 CommonJS の目標は、Web サーバー、デスクトップ、およびコマンド ライン アプリケーション用の共通の API セットを定義することです。

CommonJS はモジュール API も定義します。サーバー アプリケーションには HTML ページや <script></script> タグがないため、モジュールに明確な API を提供することは理にかなっています。モジュールは、他のモジュールで使用できるように公開し (**export**)、アクセスできるようにする必要があります (**import**)。そのエクスポート モジュールの構文は次のとおりです。

---------------- add.js  --------------------
module.exports = function add(a, b){
  return a+b;
}
---------------- sum.js  --------------------
var add = require(&#39;./add&#39;);
module.exports  = function sum(n){
     return add(1, 2) + n;
}
---------------- main.js  --------------------
var sum = require(&#39;./sum&#39;);
document.getElementById(&#39;result&#39;).innerHTML = sum(3);

CommonJs は依存関係の問題を解決しますが、CommonJs の問題は、var sum = require('./sum'); の場合に同期であることです。 " >

 sum = require(&#39;./sum&#39;);时,系统将暂停,直到模块准备(ready)完成,这意味着当所有的模块都加载时,这一行代码将阻塞浏览器进程,
因此,这可能不是为浏览器端应用程序定义模块的最佳方式
<script></script> 标签,所以为模块提供一些清晰的 API 是很有意义的。模块需要被公开(**export**)以供其它模块使用,并且可以访问(**import**)。它的导出模块语法如下:

define([‘add’, ‘sum’], function(add, sum){
  document.getElementById.innerHTML = sum(3);
});

CommonJs虽然解决的依赖问题,但是CommonJs的问题在于它是同步的,var sum = require('./sum'); 时 

-------------------- html ----------------------
<p id="result"></p>
<!-- 入口文件 -->
<script data-main="main" src="require.js"></script>
-------------------- main.js ----------------------
define([&#39;sum&#39;], function(sum){
  document.getElementById(&#39;result&#39;).innerHTML = sum(3);
})
-------------------- sum.js ----------------------
define([&#39;add&#39;], function(add)){
   var sum = function(n){
       return add(1,2) + n;
   }
   return sum;
})
-------------------- add.js ----------------------
// add.js
define([], function(){
   var add = function(a, b){
      return a + b;
   };
   return add;
});

异步模块时代: AMD

npm install -g browserify

define 函数(或关键字)将依赖项列表和回调函数作为参数。回调函数的参数与数组中的依赖是相同的顺序。这相当于导入模块。并且回调函数返回一个值,即是你导出的值。

CommonJS 和 AMD 解决了模块模式中剩下的两个问题:依赖解析 和 全局作用域污染 。我们只需要处理每个模块或每个文件的依赖关系就可以了,兵器不再有全局作用域污染。

AMD的良好实现: RequireJS 依赖注入

RequireJS 是一个 JavaScript 模块加载器(module loader) 。它可以根据需要异步加载模块,尽管 RequireJS 的名字中含有 require,但是它的目标却并非要去支持 CommonJS 的 require 语法。使用 RequireJS,可以编写 AMD 风格的模块。

---------------- html.js  --------------------

---------------- add.js -------------------- module.exports = function add(a, b){ return a+b; } ---------------- sum.js -------------------- var add = require(&#39;./add&#39;); module.exports = function sum(n){ return add(1, 2) + n; } ---------------- main.js -------------------- var sum = require(&#39;./sum&#39;); document.getElementById(&#39;result&#39;).innerHTML = sum(3); 命令: browserify main.js -o bundle.js

浏览器加载 index.html,而 index.html 又加载 require.js 。剩下的文件及其依赖都是由require.js 负责加载。

RequireJS 和 AMD 解决了我们以前所遇到的所有问题。然而,它也带来了一些不那么严重的问题:

1.AMD 的语法过于冗余。因为所有东西都封装在 define 函数中

2.数组中的依赖列表必须与函数的参数列表匹配。如果存在许多依赖项,则很难维护依赖项的顺序

3.在当前浏览器下(HTTP 1.1),加载很多小文件会降低性能

模块打包器: Browserify

可以在浏览器中使用 CommonJS 模块,通过 Browserify 遍历代码的依赖树,并将依赖树中的所有模块打包成一个文件。

不同于 RequireJS ,Browserify 是一个命令行工具,需要依赖 NPM 环境,

// UMD 风格编写的 sum 模块
//sum.umd.js
(function (root, factory) {
    if (typeof define === &#39;function&#39; && define.amd) {
        // AMD
        define([&#39;add&#39;], factory);
    } else if (typeof exports === &#39;object&#39;) {
        // Node, CommonJS-like
        module.exports = factory(require(&#39;add&#39;));
    } else {
        // Browser globals (root is window)
        root.sum = factory(root.add);
    }
}(this, function (add) {
    //  private methods
    //  exposed public methods
    return function(n) {
      return add(1,2) + n;
    }
}));
---------------- main.js ---------------
import sum from &#39;./sum&#39;;
document.getElementById(&#39;result&#39;).innerHTML = sum(3);
---------------- sum.js ---------------
import add from &#39;./add&#39;;
export default function sum(n){
   return  add(1, 2) + n;
};
---------------- add.js ---------------
export default function add(a, b){
   return a + b;
};

 困惑的时代: UMD

 UMD 是一套用来识别当前环境支持的模块风格的 if/else 语句

--------------- add.js -----------------
let add = (a,b) => a + b;
let sub = (a,b) => a - b;
export { add, sub };
--------------- sum.js -----------------
import { add } from &#39;./add&#39;;
export default (n) => {return add(1, 2) + n};
--------------- main.js ----------------
import sum from &#39;./sum&#39;;
document.getElementById(&#39;result&#39;).innerHTML = sum(3);

命令: rollup main.js -o bundle.js
--------------- boundle.js ----------------
// bundle.js
let add = (a,b) => a + b;
var sum = (n) => {return add(1, 2) + n};
document.getElementById("answer").innerHTML = sum(3);

无论是JavaScript 全局模块对象,还是 CommonJS 或是 AMD 更是 UMD,都太麻烦了,额外增加了很多工作量,并且不易维护。

光明的时代: ES6模块语法

ES6 用 import 和 export

非同期モジュール時代

: AMD

rrreeedefine 関数 (またはキーワード) は、依存関係リストと コールバック関数 をパラメータとして使用します。コールバック 関数のパラメータは、配列内の依存関係と同じ順序になっています。これはモジュールをインポートすることと同じです。そして、コールバック関数は、エクスポートした値である値を返します。

CommonJS と AMD は、モジュール パターンに残っている 2 つの問題、つまり、🎜依存関係の解決🎜 と 🎜グローバル スコープの汚染🎜 を解決します。各モジュールまたは各ファイルの依存関係に対処するだけで済み、兵器による地球規模の汚染はなくなりました。
🎜🎜🎜🎜 AMD の優れた実装: RequireJS 🎜🎜Dependency Injection🎜 🎜🎜🎜🎜🎜🎜RequireJS は JavaScript モジュール ローダーです。 RequireJS の名前には require が含まれていますが、その目的は CommonJS の require 構文をサポートすることではありません。 RequireJS を使用すると、AMD スタイルのモジュールを作成できます。 🎜rrreee🎜 ブラウザは index.html を読み込み、index.htmlrequire.js を読み込みます。残りのファイルとその依存関係は、require.js によってロードされます。 🎜🎜RequireJS と AMD は、これまでに抱えていた問題をすべて解決します。ただし、それほど深刻ではない問題もいくつか発生します: 🎜🎜1. AMD の構文は冗長すぎます。すべてが define 関数にカプセル化されているためです🎜🎜2. 配列内の依存関係リストは関数のパラメーター リストと一致する必要があります。多くの依存関係がある場合、依存関係の順序を維持することが困難です 🎜🎜3. 現在のブラウザー (HTTP 1.1) では、多数の小さなファイルを読み込むとパフォーマンスが低下します 🎜🎜🎜🎜モジュール パッケージャー: 🎜Browserify🎜🎜🎜ブラウザで CommonJS モジュールを使用し、Browserify を通じてコードの依存関係ツリーをたどって、すべての依存関係を追加できます。依存関係ツリー モジュールはファイルにパッケージ化されます。 🎜🎜 RequireJS とは異なり、Browserify は NPM 環境に依存する必要があるコマンド ライン ツールです。🎜rrreeerrreee🎜 🎜🎜混乱する時: UMD🎜
🎜🎜🎜 UMD は、次の目的で使用されるツールのセットです。現在の環境のサポート モジュール スタイルの if/else ステートメントを特定します🎜rrreee🎜 JavaScript グローバル モジュール オブジェクト、CommonJS、AMD、さらには UMD であっても、これは非常に面倒で、多くの余分な作業負荷が追加され、メンテナンスが容易ではありません。 🎜🎜🎜🎜明るい時代: ES6 モジュール構文🎜🎜🎜🎜ES6 は、モジュールのインポートとエクスポートに import キーワードと export キーワードを使用します🎜rrreee🎜 ES6 モジュール構文は簡潔ですが、現在、すべてのブラウザがサポートしているわけではありませんが、いくつかのツール (babel) を使用して変換できます🎜🎜🎜🎜エンジニアリングの時代: Webpack🎜🎜🎜

虽然gulp、grunt都号称是工程化开发工具,,但个人感觉他们处理的东西还是比较基础,对于模块依赖打包来说,支持不是非常好,反正我是不喜欢gulp.

Webpack 是一个 模块打包器,就像 Browserify 一样,它会遍历依赖树,然后将其打包到一到多个文件。

它与Browserify 不同之处就是 可以处理 CommonJS 、 AMD 和 ES6 模块,并且 Webpack 还有更多实用的东西,比如 代码分离、加载器、插件

简洁的时代:Rollup

rollup 只会将需要的函数包含到打包文件中,从而显著减少打包文件大小

--------------- add.js -----------------
let add = (a,b) => a + b;
let sub = (a,b) => a - b;
export { add, sub };
--------------- sum.js -----------------
import { add } from &#39;./add&#39;;
export default (n) => {return add(1, 2) + n};
--------------- main.js ----------------
import sum from &#39;./sum&#39;;
document.getElementById(&#39;result&#39;).innerHTML = sum(3);

命令: rollup main.js -o bundle.js
--------------- boundle.js ----------------
// bundle.js
let add = (a,b) => a + b;
var sum = (n) => {return add(1, 2) + n};
document.getElementById("answer").innerHTML = sum(3);

发现 add.js的 sub() 函数并没有包含在这个打包文件中,因为没有引用它。

以上がJavaScript におけるモジュール理解の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptエンジン:実装の比較JavaScriptエンジン:実装の比較Apr 13, 2025 am 12:05 AM

さまざまなJavaScriptエンジンは、各エンジンの実装原則と最適化戦略が異なるため、JavaScriptコードを解析および実行するときに異なる効果をもたらします。 1。語彙分析:ソースコードを語彙ユニットに変換します。 2。文法分析:抽象的な構文ツリーを生成します。 3。最適化とコンパイル:JITコンパイラを介してマシンコードを生成します。 4。実行:マシンコードを実行します。 V8エンジンはインスタントコンピレーションと非表示クラスを通じて最適化され、Spidermonkeyはタイプ推論システムを使用して、同じコードで異なるパフォーマンスパフォーマンスをもたらします。

ブラウザを超えて:現実世界のJavaScriptブラウザを超えて:現実世界のJavaScriptApr 12, 2025 am 12:06 AM

現実世界におけるJavaScriptのアプリケーションには、サーバー側のプログラミング、モバイルアプリケーション開発、モノのインターネット制御が含まれます。 2。モバイルアプリケーションの開発は、ReactNativeを通じて実行され、クロスプラットフォームの展開をサポートします。 3.ハードウェアの相互作用に適したJohnny-Fiveライブラリを介したIoTデバイス制御に使用されます。

next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する(バックエンド統合)Apr 11, 2025 am 08:23 AM

私はあなたの日常的な技術ツールを使用して機能的なマルチテナントSaaSアプリケーション(EDTECHアプリ)を作成しましたが、あなたは同じことをすることができます。 まず、マルチテナントSaaSアプリケーションとは何ですか? マルチテナントSaaSアプリケーションを使用すると、Singの複数の顧客にサービスを提供できます

next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)next.jsを使用してマルチテナントSaaSアプリケーションを構築する方法(フロントエンド統合)Apr 11, 2025 am 08:22 AM

この記事では、許可によって保護されたバックエンドとのフロントエンド統合を示し、next.jsを使用して機能的なedtech SaaSアプリケーションを構築します。 FrontEndはユーザーのアクセス許可を取得してUIの可視性を制御し、APIリクエストがロールベースに付着することを保証します

JavaScript:Web言語の汎用性の調査JavaScript:Web言語の汎用性の調査Apr 11, 2025 am 12:01 AM

JavaScriptは、現代のWeb開発のコア言語であり、その多様性と柔軟性に広く使用されています。 1)フロントエンド開発:DOM操作と最新のフレームワーク(React、Vue.JS、Angularなど)を通じて、動的なWebページとシングルページアプリケーションを構築します。 2)サーバー側の開発:node.jsは、非ブロッキングI/Oモデルを使用して、高い並行性とリアルタイムアプリケーションを処理します。 3)モバイルおよびデスクトップアプリケーション開発:クロスプラットフォーム開発は、反応および電子を通じて実現され、開発効率を向上させます。

JavaScriptの進化:現在の傾向と将来の見通しJavaScriptの進化:現在の傾向と将来の見通しApr 10, 2025 am 09:33 AM

JavaScriptの最新トレンドには、TypeScriptの台頭、最新のフレームワークとライブラリの人気、WebAssemblyの適用が含まれます。将来の見通しは、より強力なタイプシステム、サーバー側のJavaScriptの開発、人工知能と機械学習の拡大、およびIoTおよびEDGEコンピューティングの可能性をカバーしています。

javascriptの分解:それが何をするのか、なぜそれが重要なのかjavascriptの分解:それが何をするのか、なぜそれが重要なのかApr 09, 2025 am 12:07 AM

JavaScriptは現代のWeb開発の基礎であり、その主な機能には、イベント駆動型のプログラミング、動的コンテンツ生成、非同期プログラミングが含まれます。 1)イベント駆動型プログラミングにより、Webページはユーザー操作に応じて動的に変更できます。 2)動的コンテンツ生成により、条件に応じてページコンテンツを調整できます。 3)非同期プログラミングにより、ユーザーインターフェイスがブロックされないようにします。 JavaScriptは、Webインタラクション、シングルページアプリケーション、サーバー側の開発で広く使用されており、ユーザーエクスペリエンスとクロスプラットフォーム開発の柔軟性を大幅に改善しています。

pythonまたはjavascriptの方がいいですか?pythonまたはjavascriptの方がいいですか?Apr 06, 2025 am 12:14 AM

Pythonはデータサイエンスや機械学習により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、簡潔な構文とリッチライブラリエコシステムで知られており、データ分析とWeb開発に適しています。 2。JavaScriptは、フロントエンド開発の中核です。 node.jsはサーバー側のプログラミングをサポートしており、フルスタック開発に適しています。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

MantisBT

MantisBT

Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

SublimeText3 英語版

SublimeText3 英語版

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

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)