検索
ホームページウェブフロントエンドjsチュートリアルモジュール型プログラミングとは何ですか? jsモジュールプログラミングの概要

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」という名前のモジュールを作成します:

  • ul>
    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 までご連絡ください。
JavaScriptのデータ型:ブラウザとNodejsに違いはありますか?JavaScriptのデータ型:ブラウザとNodejsに違いはありますか?May 14, 2025 am 12:15 AM

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

JavaScriptコメント://および / * *を使用するためのガイドJavaScriptコメント://および / * *を使用するためのガイドMay 13, 2025 pm 03:49 PM

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

Python vs. JavaScript:開発者の比較分析Python vs. JavaScript:開発者の比較分析May 09, 2025 am 12:22 AM

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

Python vs. JavaScript:ジョブに適したツールを選択するPython vs. JavaScript:ジョブに適したツールを選択するMay 08, 2025 am 12:10 AM

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

PythonとJavaScript:それぞれの強みを理解するPythonとJavaScript:それぞれの強みを理解するMay 06, 2025 am 12:15 AM

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

JavaScriptのコア:CまたはCの上に構築されていますか?JavaScriptのコア:CまたはCの上に構築されていますか?May 05, 2025 am 12:07 AM

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

JavaScriptアプリケーション:フロントエンドからバックエンドまでJavaScriptアプリケーション:フロントエンドからバックエンドまでMay 04, 2025 am 12:12 AM

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

Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

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

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

Video Face Swap

Video Face Swap

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

ホットツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SublimeText3 英語版

SublimeText3 英語版

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

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール