js模块化规范—AMD规范

AMD规范说明

AMD全称是:Asynchronous Module Definition(异步模块定义),github地址

是专门用于浏览器端, 模块的加载是异步的 

 

 

AMD规范基本语法

定义暴露模块

//定义没有依赖的模块
define(function(){
    return 模块
})
//定义有依赖的模块,module1和m1一一对应
define(['module1', 'module2'], function(m1, m2){
    return 模块
})

引入使用模块

require(['module1', 'module2'], function(m1, m2){
    使用m1/m2
})

 

 

未使用AMD规范的模块化

// 没有依赖的模块
(function (window) {
  let msg = 'atguigu.com'

  function getMsg() {
    return msg.toUpperCase()
  }

  window.dataService = {getMsg}
})(window)
// 依赖dataService模块,调用dataService的getMsg方法
(function (window, dataService) {
  let name = 'Tom'

  function showMsg() {
    alert(dataService.getMsg() + ', ' + name)
  }

  window.alerter = {showMsg}
})(window, dataService)
(function (alerter) {
  alerter.showMsg()
})(alerter)
<!DOCTYPE html>
<html>
<head>
  <title>Modular Demo 1</title>
</head>
<body>
<div>
  <h1>Modular Demo 1: 未使用AMD(require.js)</h1>
</div>
<script type='text/javascript' src='js/modules/dataService.js'></script>
<script type='text/javascript' src='js/modules/alerter.js'></script>
<script type="text/javascript" src="js/main.js"></script>
</body>
</html>

 

 

 

AMD规范的实现(浏览器端)

AMD规范需要使用到require.js这个插件,下载require.js, 并引入,将require.js导入项目: js/libs/require.js

创建项目结构

|-js
  |-libs
    |-require.js
  |-modules
    |-alerter.js
    |-dataService.js
  |-main.js
|-index.html

定义require.js的模块代码:dataService.js

define(function () {
  let msg = 'dataService.js'

  function getMsg() {
    return msg.toUpperCase()
  }

  return {getMsg} //暴露模块中的getMsg方法
})

定义require.js的模块代码:alerter.js

/*
 定义有依赖的模块
 */
define(['dataService', 'jquery'], function (dataService, $) {
  let name = 'Tom2'

  function showMsg() {
    $('body').css('background', 'gray')
    alert(dataService.getMsg() + ', ' + name)
  }

  return {showMsg}
})

应用主(入口)js: main.js

(function () {
  //配置
  require.config({
    //基本路径
    baseUrl: 'js/',
    //映射: 模块标识名: 路径
    paths: {
      //自定义模块
      'alerter': 'modules/alerter',
      'dataService': 'modules/dataService',

      //库模块
      'jquery': 'libs/jquery-1.10.1', // jquery遵循AMD规范,模块标识名是jquery(小写)
      'angular': 'libs/angular'
      
    },

    //配置不兼容AMD的模块
    shim: {
      angular: {
        exports: 'angular'
      }
    }
  })

  //引入模块使用
  require(['alerter', 'angular'], function (alerter, angular) {
    alerter.showMsg()
    console.log(angular);
  })
})()
<!DOCTYPE html>
<html>
<head>
<title>Modular Demo 2</title>
</head>
<body>
    <script type="text/javascript" src="js/libs/require.js" data-main="js/main.js"></script>
 </body>
</html>

 

posted @ 2019-04-04 19:29  胡椒粉hjf  阅读(247)  评论(0编辑  收藏  举报