目次
別の問題があります。上記のコードは 2 つのグローバル変数を公開しており、
1 が最初にページに印刷され、次に August 9, 2018 が印刷されます。したがって、AMD のロードは、後続のステートメントの実行には影響しません。
5 总结
ホームページ ウェブフロントエンド jsチュートリアル モジュール型プログラミングとは何ですか? jsモジュールプログラミングの概要

モジュール型プログラミングとは何ですか? jsモジュールプログラミングの概要

Aug 10, 2018 pm 04:51 PM

1 モジュール型プログラミングとは

2 モジュール型である必要がある理由

3 AMD

4 CommonJS

5 概要

テクノロジーを理解するには、まずテクノロジーの背景とそれが解決する問題を理解する必要がありますではなく、使い方を知るだけで十分です。以前の状態は実際の原因やメリットを知らずに、ただ理解するだけだったかもしれないので、今日はそれをまとめてみましょう。

1 機能を決定し、これらのモジュール間に必要な接続を確立し、モジュールの相互協力によって全体の機能を完成させます。

例えば、Javaのインポート、C#の使用。私の理解では、モジュール式プログラミングにより、さまざまな機能を分離でき、1 つの機能を変更しても他の機能に影響を与えることはありません。

2 なぜモジュール化するのか

次の例を見てみましょう
// A.jsfunction sayWord(type){
    if(type === 1){
        console.log("hello");
    }else if(type === 2){
        console.log("world");
    }
}// B.jsfunction Hello(){
    sayWord(1);
}// C.jsHello()
ログイン後にコピー

上記 3 つのファイルのうち、B.js は A.js のコンテンツを参照し、C.js は B.js のコンテンツを参照するとします。 . C.js の人が B.js を参照することしか知らない場合、と書くと、A.js を参照しないため、プログラム エラーが発生し、ファイルの参照順序が間違っているはずがありません。コード全体のデバッグや変更に不便をもたらします。

別の問題があります。上記のコードは 2 つのグローバル変数を公開しており、

3 AMD

AMD は非同期モジュール定義です。モジュールは非同期でロードされます。モジュールのロードは、後続のステートメントの実行には影響しません。

次の状況を想定します

// util.jsdefine(function(){
    return {
        getFormatDate:function(date,type){
            if(type === 1){                return '2018-08-9'
            }            if(type === 2){                return '2018 年 8 月 9 日'
            }
        }
    }
})// a-util.jsdefine(['./util.js'],function(util){
    return {
        aGetFormatDate:function(date){
            return util.getFormatDate(date,2)
        }
    }
})// a.jsdefine(['./a-util.js'],function(aUtil){
    return {
        printDate:function(date){
            console.log(aUtil.aGetFormatDate(date))
        }
    }
})// main.jsrequire(['./a.js'],function(a){
    var date = new Date()
    a.printDate(date)
})
console.log(1);// 使用// <script src = "/require.min.js" data-main="./main.js"></script>
ログイン後にコピー

1 が最初にページに印刷され、次に August 9, 2018 が印刷されます。したがって、AMD のロードは、後続のステートメントの実行には影響しません。

非同期でロードされない場合はどうなりますか

var a = require(&#39;a&#39;);
console.log(1)
ログイン後にコピー

以下のステートメントは、実行する前にロードされるまで待つ必要があります。ロード時間が長すぎると、プログラム全体がここで停止します。したがって、ブラウザはリソースを同期的に読み込むことができません。これが AMD の背景でもあります。

AMDはブラウザ側でのモジュール開発のための仕様です。この仕様はもともとJavaScriptではサポートされていないため、AMD仕様を使用して開発する場合はサードパーティのライブラリ関数、つまりRequireJSを導入する必要があります。 1,然后才会打印 2018 年 8 月 9 日。因此 AMD 的加载并不会影响后续的语句执行。

如果不是异步加载会出现什么情况呢

// ? 代表该参数可选
    define(id?, dependencies?, factory);
ログイン後にコピー

后面的语句需要等待 a 加载完成才能执行,如果加载时间过长,整个程序都会卡在这。因此,浏览器不能同步加载资源,这也是 AMD 的产生背景。

AMD 是在浏览器端实现模块化开发的规范。由于该规范不是 JavaScript 原始支持的,使用 AMD 规范进行开发的时候需要引入第三方的库函数,也就是 RequireJS。

RequireJS 主要解决的问题

  • 使 JS 异步加载,避免页面失去响应

  • 管理代码之间的依赖性,有利于代码的编写和维护

下面来看看如何使用 require.js

要想使用 require.js,首先要 define

define("alpha", ["require", "exports", "beta"], function (require, exports, beta) {
       exports.verb = function() {
           return beta.verb();           //Or:
           return require("beta").verb();
       }
   });
ログイン後にコピー
  • id:指的是定义的模块的名字

  • dependencies:是定义的模块所依赖模块的数组

  • factory:为模块初始化要执行的函数或对象。如果为函数,它应该只被执行一次。如果是对象,此对象应该为模块的输出值。

    具体的规范说明可以参考 AMD (中文版)
    举个例子,创建一个名为 “alpha” 的模块,使用了 require,exports,和名为 “beta” 的模块:

define(["alpha"], function (alpha) {
       return {
         verb: function(){
           return alpha.verb() + 2;
         }
       };
   });
ログイン後にコピー

一个返回对象的匿名模块:

define({
     add: function(x, y){
       return x + y;
     }
   });
ログイン後にコピー

一个没有依赖性的模块可以直接定义对象:

require([module],callback);
ログイン後にコピー

如何使用

AMD 采用 require 语句加载模块

require([&#39;./a.js&#39;],function(a){
    var date = new Date()
    a.printDate(date)
})
ログイン後にコピー
  • module:是一个数组,里面的成员是要加载的模块

  • callback:加载成功之后的回调函数

例如

// util.jsdefine(function(){
    return {
        getFormatDate:function(date,type){
            if(type === 1){                return '2018-08-09'
            }            if(type === 2){                return '2018 年 8 月 9 日'
            }
        }
    }
})// a-util.jsdefine(['./util.js'],function(util){
    return {
        aGetFormatDate:function(date){
            return util.getFormatDate(date,2)
        }
    }
})// a.jsdefine(['./a-util.js'],function(aUtil){
    return {
        printDate:function(date){
            console.log(aUtil.aGetFormatDate(date))
        }
    }
})// main.jsrequire([&#39;./a.js&#39;],function(a){
    var date = new Date()
    a.printDate(date)
})// 使用// 
ログイン後にコピー

具体的使用方法如下

require.config({
    paths:{        "a":"src/a.js",        "b":"src/b.js"
    }
})
ログイン後にコピー

假设这里有 4 个文件,util.js,a-util.js 引用了 util.js,a.js 引用了 a-util.js,main.js 引用了 a.js。

其中,data-main 属性的作用是加载网页程序的主模块。

上例演示了一个主模块最简单的写法,默认情况下,require.js 假设依赖和主模块在同一个目录。

使用 require.config() 方法可以对模块的加载行为进行自定义。require.config()

RequireJS によって解決される主な問題

  • ページの応答損失を避けるために JS を非同期でロードできるようにする

  • コード間の依存関係を管理する, コードの作成とメンテナンスに役立ちます

require.js の使い方を見てみましょう

require.js を使用したい場合は、まず定義する必要があります

require.config({

    baseUrl: "src",

    paths: {

      "a": "a.js",
      "b": "b.js",

    }

  });
ログイン後にコピー
  • id: 定義されたモジュールの名前を参照します

  • dependency: 定義されたモジュールが依存するモジュールの配列です

  • factory: モジュールを初期化します。 実行する関数またはオブジェクト。関数の場合は、一度だけ実行する必要があります。それがオブジェクトの場合、このオブジェクトはモジュールの出力値である必要があります。

    特定の仕様については、AMD (中国語版) を参照してください。

    たとえば、「alpha」という名前のモジュールを作成し、require、exports を使用し、「beta」という名前のモジュールを作成します:

  • const util = require(&#39;util&#39;);
    ログイン後にコピー
    🎜オブジェクトを返す匿名モジュール:🎜
    const util = require(&#39;util&#39;);var date = new date();
    util.getFormatDate(date,1);
    ログイン後にコピー
    🎜依存関係のないモジュールはオブジェクトを直接定義できます:🎜
    // util.jsmodule.exports = {
        getFormatDate:function(date, type){
             if(type === 1){                return &#39;2017-06-15&#39;
              }          if(type === 2){                return &#39;2017 年 6 月 15 日&#39;
              }
        }
    }// a-util.jsconst util = require(&#39;util.js&#39;)
    module.exports = {
        aGetFormatDate:function(date){
            return util.getFormatDate(date,2)
        }
    }
    ログイン後にコピー
    🎜使用方法🎜🎜AMD は require ステートメントを使用してモジュールをロードします🎜
     // foobar.js
     // 定义行为
     function foobar(){
             this.foo = function(){
                     console.log(&#39;Hello foo&#39;);
            }  
             this.bar = function(){
                     console.log(&#39;Hello bar&#39;);
              }
     } // 把 foobar 暴露给其它模块
     exports.foobar = foobar;// main.js//使用文件与模块文件在同一目录var foobar = require(&#39;./foobar&#39;).foobar,
    test = new foobar();
    test.bar(); // &#39;Hello bar&#39;
    ログイン後にコピー
    ログイン後にコピー
    • 🎜module: は配列であり、内部のメンバーはロードされるモジュールです🎜
    • 🎜callback: ロードが成功した後のコールバック関数です🎜
    🎜例:🎜rrreee 🎜具体的な使い方は以下の通りです🎜rrreee🎜ここに4つのファイルがあるとします、util.js、a-util.jsはutil.jsを指し、a.jsはa-util.jsを指し、main.jsはaを指します。 js 。 🎜🎜その中で、data-main属性はWebプログラムのメインモジュールをロードするために使用されます。 🎜🎜上記の例は、メイン モジュールを作成する最も簡単な方法を示しています。デフォルトでは、require.js は依存関係がメイン モジュールと同じディレクトリにあることを前提としています。 🎜🎜モジュールの読み込み動作をカスタマイズするには、require.config() メソッドを使用します。 require.config() はメインモジュール (main.js) の先頭に記述されており、このオブジェクトの paths 属性で各モジュールの読み込みパスを指定します。ベースディレクトリ (baseUrl) を変更します🎜rrreee🎜4 CommonJS🎜🎜commonJS は、nodejs のモジュール仕様であり、ビルドツールの高度な自動化により、現在フロントエンドで広く使用されており、npm を使用するコストは高くなります。とても低い。 commonJS は JS を非同期的にロードするのではなく、同期的に一度にロードします。 commonJS には、🎜rrreee🎜 などのモジュールをロードするために使用されるグローバル メソッドがあり、その後、util🎜 によって提供されるメソッドを呼び出すことができます。 rrreee🎜commonJS には、モジュール定義 (エクスポート)、モジュール参照 (必須)、モジュール識別 (モジュール) の 3 つのモジュール定義があります。🎜🎜exports() オブジェクトは、現在のモジュールの変数またはメソッドをエクスポートするために使用され、唯一のエクスポート ポートです。 require() は外部モジュールを導入するために使用されます。モジュール オブジェクトはモジュール自体を表します。 🎜🎜例を教えてください🎜rrreee🎜または次の方法🎜
     // foobar.js
     // 定义行为
     function foobar(){
             this.foo = function(){
                     console.log(&#39;Hello foo&#39;);
            }  
             this.bar = function(){
                     console.log(&#39;Hello bar&#39;);
              }
     } // 把 foobar 暴露给其它模块
     exports.foobar = foobar;// main.js//使用文件与模块文件在同一目录var foobar = require(&#39;./foobar&#39;).foobar,
    test = new foobar();
    test.bar(); // &#39;Hello bar&#39;
    ログイン後にコピー
    ログイン後にコピー

    5 总结

    CommonJS 则采用了服务器优先的策略,使用同步方式加载模块,而 AMD 采用异步加载的方式。所以如果需要使用异步加载 js 的话建议使用 AMD,而当项目使用了 npm 的情况下建议使用 CommonJS。

    相关推荐:

    论JavaScript模块化编程

    requireJS框架模块化编程实例详解

    以上がモジュール型プログラミングとは何ですか? jsモジュールプログラミングの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

C/CからJavaScriptへ:すべてがどのように機能するか C/CからJavaScriptへ:すべてがどのように機能するか Apr 14, 2025 am 12:05 AM

C/CからJavaScriptへのシフトには、動的なタイピング、ゴミ収集、非同期プログラミングへの適応が必要です。 1)C/Cは、手動メモリ管理を必要とする静的に型付けられた言語であり、JavaScriptは動的に型付けされ、ごみ収集が自動的に処理されます。 2)C/Cはマシンコードにコンパイルする必要がありますが、JavaScriptは解釈言語です。 3)JavaScriptは、閉鎖、プロトタイプチェーン、約束などの概念を導入します。これにより、柔軟性と非同期プログラミング機能が向上します。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

See all articles