JS模块化规范——AMD相关笔记

AMD

AMD规范时间早于CommonJS浏览器端实现

一、没有模块化规范时

  1. 创建项目结构
|-js
  |-alerter.js
  |-dataService.js 
|-test1.html
|-app.js
  1. 定义模块代码
  • dataService.js
// 定义一个没有依赖的模块
(function (window) {
  let name = 'dataService.js'

  function getName() {
    return name
  }
  window.dataService = {getName}
})(window)
  • alert.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)
  • tets1.html页面引用
  <script src="./js/dataService.js"></script>
  <script src="./js/dataService.js"></script>
  <script src="./app.js"></script>

二、规范

2.1 说明
  • Asynchronous Module Definition( 异步模块定义)

  • https://github.com/amdjs/amdjs-api/wiki/AMD

  • 它是一个在浏览器端模块化开发的规范。它不是javascript原生支持,所以使用AMD规范进行页面开发需要用到对应的库,也就是RequireJS,AMD其实是RequireJS在推广的过程中对模块定义的范围化的产出。

  • 它的实现方案是:先定义所有依赖,然后在加载完成后的回调函数中执行。

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

2.2 基本语法
  • 定义暴露模块
//定义没有依赖的模块
define(function(){
	return 模块
})
//定义有依赖的模块
define(['module1', 'module2'], function(m1, m2){   // 显式声明依赖注入
	return 模块
})
  • 引入使用模块
require(['module1', 'module2'], function(m1, m2){
	使用m1/m2
})

三、自定义模块实现(require.js)

  1. 下载require.js, 并引入
  • 官网: http://www.requirejs.cn/
  • github : https://github.com/requirejs/requirejs
  • 将require.js导入项目: js/libs/require.js
  1. 创建项目结构
|-js
  |-libs
    |-require.js
  |-modules
    |-alerter.js
    |-dataService.js
  |-main.js
|-index.html
  1. 定义require.js的模块代码
  • dataService.js

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

    // 定义有依赖的模块
    define(['dataService'], function(dataService) {
      let msg = 'alerter.js'
      function showMsg() {
        console.log(msg, dataService.getName())
      }
    
      // 暴露模块
      return {showMsg}
    })
    
  1. 应用主(入口)js: main.js
(function () {

requirejs.config({
  baseUrl: 'js/',  // 基本的路径 这表示出发点在根目录下 如果不用则从当前目录出发
  paths: {  // 配置路径
    dataService: './modules/dataService',  // 不要加.js  默认会自己加上
    alerter: './modules/alerter'
  }
});

requirejs(['alerter'], function(alerter) {
  alerter.showMsg()
})
})()
  1. 页面使用模块:
  <!--引入require.js并指定js主文件的入口-->
  <script data-main="js/main" src="js/libs/require.js"></script>

四、第三方基于require.js的框架模块实现(jQuery)

  • 将jquery的库文件导入到项目:

    • js/libs/jquery-1.10.1.js

    • 在main.js中配置jquery路径(jQuery源码中支持AMD规范,它自己定义了一个模块,该模块名字叫jquery,所有注意jQuery遇到AMD规范时名字必须小写)

      paths: {
                'jquery': 'libs/jquery-1.10.1'
            }
      
    • 在alerter.js中使用jquery

      define(['dataService', 'jquery'], function (dataService, $) {
          var name = 'xfzhang'
          function showMsg() {
              $('body').css({background : 'red'})
              alert(name + ' '+dataService.getMsg())
          }
          return {showMsg}
      })
      

  1. 使用第三方不基于require.js的框架(angular)

    并不是所有的第三方库都支持AMD规范,例如Angular.js

    要用的话需要单独配置,向外暴露

    • 将angular.js导入项目
    • js/libs/angular.js
  • 在main.js中配置

    paths: { // 配置路径
          angular: './libs/angular'
        },
        shim: {
          angular: {
            exports: 'angular'
          }
        }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值