JS模块化之AMD规范

Posted eyes++

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS模块化之AMD规范相关的知识,希望对你有一定的参考价值。

AMD概述

AMD说明:
    AMD:Asynchronous Module Definition(异步模块定义)
    专门用于浏览器端,模块的加载是异步的
基本语法:
    定义暴露模块:
        1. 没有依赖的模块:
            define(function(){
                return 模块
            })
        2. 定义有依赖的模块:
            define(['module1','module2'],function(m1,m2){
                return 模块
            })
    引入使用模块:
        require(['module1','module2'],function(m1,m2){
            使用m1/m2
        })
实现(浏览器端):
    使用库: Require.js

没有AMD之前的模块化编程

目录结构
dataService.js:(用于提供数据)

// 定义一个没有依赖的模块
(function(window){
    let name = 'dataService.js';
    function getName(){
        return name;
    }
    window.dataService = {getName};
})(window)

alerter.js: (用于使用数据)

// 定义一个有依赖的模块
(function (window, dataService) {
    let msg = 'alerter.js';
    function showMsg() {
        console.log(msg,dataService.getName());
    }
    window.alerter = {showMsg};
})(window, dataService)

app.js: (作为根模板)

(function(alerter){
    alerter.showMsg();
})(alerter)

index.html: (在浏览器端展示,引用顺序不能乱)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script src="./js/dataService.js"></script>
    <script src="./js/alerter.js"></script>
    <script src="./app.js"></script>
</body>
</html>

代码总览:
代码总览这种方法虽然可以有效避免变量名污染,但各模板间的依赖关系有可能极为复杂,导致js文件引入出现问题。

使用AMD的模块化

RequireJS是一个非常小巧的javascript模块载入框架,是AMD规范最好的实现者之一,因此以下使用RequireJS展示。
目录结构:
目录展示
dataService.js:

// 定义没有依赖的模板
define(function() {
    let name = 'dataService.js';
    function getName() {
        return name;
    }
    // 暴露模块
    return {getName};
});

alerter.js:

// 定义有依赖的模块
define(['dataService','jquery'], function(dataService, $) {
    let msg = 'alerter.js';
    function showMsg() {
        console.log(msg, dataService.getName());
    }
    $('body').css('background', 'pink');
    // 暴露模块
    return {showMsg};
});

app.js:

(function(){
    requirejs.config({ // 参数配置
        // baseURL: 'js/', 基本路径,若开启,则路径为baseURL+paths
        paths: { // 配置路径,用以寻找模块
            dataService: './modules/dataService', // 此处不加.js后缀,因为运行时默认会加上
            alerter: './modules/alerter',
            jquery: './libs/jquery-2.2.4.min'
        }
    })

    requirejs(['alerter'], function(alerter){
        alerter.showMsg();
    })
})()

index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- data-main引入入口js文件,src引入require.js库 -->
    <script data-main="./js/app.js" src="./js/libs/require.min.js"></script>
</body>
</html>

代码总览:
代码总览

以上是关于JS模块化之AMD规范的主要内容,如果未能解决你的问题,请参考以下文章

js模块化编程之CommonJS和AMD/CMD

js模块化编程之CommonJS和AMD/CMD

js模块化编程之彻底弄懂CommonJS和AMD/CMD!

js模块化编程之彻底弄懂CommonJS和AMD/CMD!

RequireJS和AMD规范

理解JS中的模块规范(CommonJS,AMD,CMD)