前端模块化详解

模块化:js天生不支持模块化,简单来说就是不能在一个js文件中引入另一个js文件。但由于js文件越来越来越大,很不方便,一些大神自己编写js底层文件让其支持模块化。
模块化规范:AMD CMD CommonJS ES6

前端模块化详解

模块化开发的意义和发展

javascript本身是弱化命名空间概念的,只有全局作用域和函数私有作用域(es6中新增模块作用域),而模块化开发,从某种意义上来说,是强化了命名空间的概念!

  • 有利于代码分离,解耦以及复用
  • 团队并行开发
  • 避免命名冲突
  • 互相应用,按需加载
模块化的发展史
  • 单例设计模式
  • AMD
  • CMD
  • UMD
  • CommonJS
  • ES6 Module
单例设计模式
<script>
	// 高级单例模式:创建一个命名空间(模块名)接收返回的相关信息,实现把信息(方法..)暴露给别的模块使用
	let module = (function(){
		let name = '哈哈'
		function query(){
			console.log('这是一个方法')
		}
		funciton fn(){
			console.log('fn')
		}
		
		window.query=query  // 挂载在window对象上,给别的模块使用,但是挂载的比较多后也可能出现问题
		// 优化后做法
		return {
			query:query
		}

     })() // 写在函数里为了避免变量污染

	let module2 = (function(){

		module1.query()
		funciton fn(){
			console.log('fn2')
		}

     })()

</script>

AMD模块化思想-require.js

main.js

在这里插入图片描述在这里插入图片描述
module A.js

/* 定义模块
*AMD思想中,模块的定义基于 define 完成
*  define([name]?(?号的意思是可写可不写),[dependence]?,factory)
* name: 模块的名字
* dependence:依赖,定义的模块依赖那些模块
* factory: 当前定义的模块
*/

define(function(){
	// 任意数求和
	function sum(...args){
		let len=args.length;
		if(len==10) return 0
		if(len===1) return args[0]
		return args.reduce((total,item)=>{
			return total + item
		})
	}

	// 把指定的方法暴露到外面
	return {
		sum
	}

}

module B.js

定义模块时引入依赖模块
/* AMD思想需要在定义模块前,把依赖的模块事先导入进来*/

define(['ja/lib/moduleA'],function(moduleA){
	// =》 moduleA存储的就是你‘ja/lib/moduleA’ 这个模块导出的内容
	function average(...args){
		
	 	return (moduleA.sum(...args) / args.length).toFixed(2)
	}

	// 把指定的方法暴露到外面
	return {
		average
	}

}

main.js 入口文件

使用模块
require.config({
baseUrl:'js/lib'
})  // 全局配置

 /*AMD中导入某一个模块基于 require
 *require([dependence],[callback])
  */
 require(['moduleA','moduleB'],funciton(moduleA,moduleB){
		let result = moduleA.sum(123,145+ moduleB.average(7,8,9)

	console.log(result)
})
UMD 通用模块规范

是由社区想出来的一种整合了CommonJS和AMD两个模块定义规范的方法

  • 例:
    (function (global, factory) {
    if (typeof exports === ‘object’ && typeof module !== undefined) { //检查CommonJS是否可用
    module.exports = factory(require(‘jquery’));
    } else if (typeof define === ‘function’ && define.amd) { //检查AMD是否可用
    define(‘toggler’, [‘jquery’, factory])
    } else { //两种都不能用,把模块添加到JavaScript的全局命名空间中。
    global.toggler = factory(global, factory);
    }
    })(this, function ($) {
    function init() {
    }
    return {
    init: init
    }
    });
  • 例:
    在这里插入图片描述

CMD

CMD规范专门用于浏览器端,模块的加载是异步的,模块使用时才会加载执行。CMD规范整合了CommonJS和AMD规范的特点。在 Sea.js 中,所有 JavaScript 模块都遵循 CMD模块定义规范。

  • CMD规范基本语法
	//定义没有依赖的模块
define(function(require, exports, module){
  exports.xxx = value
  module.exports = value
})

//定义有依赖的模块
define(function(require, exports, module){
  //引入依赖模块(同步)
  var module2 = require('./module2')
  //引入依赖模块(异步)
    require.async('./module3', function (m3) {
    })
  //暴露模块
  exports.xxx = value
})
  • 引入使用模块
define(function (require) {
  var m1 = require('./module1')
  var m4 = require('./module4')
  m1.show()
  m4.show()
})

CommonJS

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
CommonJS相对于AMD来讲不需要前置依赖什么时候用到什么时候导入,而且在Node环境下的CommonJS规范,会把每一次导入模块做缓存(后期在导入,会把上次导入拷贝的结果复制一份)。
在服务器端,模块的加载是运行时同步加载的;在浏览器端,模块需要提前编译打包处理。(借助Browserify)
在一个js文件中给global对象添加属性方法,global相当于window,每个文件都有。其他模块引入require(。。。。.js)后可以直接调用其他模块属性方法(但是另有一个模块也给global挂载相同属性方法会覆盖

ES6 Module

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Odoo 是一个开源的企业资源计划(ERP)系统,它提供了一套完整的商业应用程序,包括销售、采购、库存管理、生产管理、财务管理、人力资源管理等。下面是 Odoo 的系统架构详解: 1. 前端:Odoo 使用了基于 Web 技术的前端框架,提供了直观、用户友好的界面。前端部分主要负责与用户交互,并将用户输入的数据发送给后端进行处理。 2. Web 服务器:Odoo 支持多种 Web 服务器,如 Nginx、Apache 等。Web 服务器主要负责接收用户请求,并将请求转发给 Odoo 服务器进行处理。 3. Odoo 服务器:Odoo 服务器是整个系统的核心组件,它负责处理用户请求,并根据请求的类型进行相应的操作。Odoo 服务器采用了模块化的架构,每个功能模块都可以独立安装、升级和卸载。 4. 数据库:Odoo 使用关系型数据库来存储数据,常用的数据库包括 PostgreSQL、MySQL 等。所有的数据都存储在数据库中,包括用户信息、产品信息、订单信息等。 5. 模块:Odoo 的功能被组织成多个模块,每个模块负责一个特定的功能领域。例如,销售模块负责管理销售流程,采购模块负责管理采购流程等。用户可以根据自己的需求选择安装相应的模块。 6. 业务逻辑:Odoo 的每个模块都包含了一套完整的业务逻辑。例如,在销售模块中,用户可以创建销售订单、确认订单、生成发票等。这些业务逻辑被封装在模块中,并通过 Odoo 服务器进行处理。 7. API:Odoo 提供了一组丰富的 API,使开发人员能够通过编程的方式来与系统进行交互。开发人员可以使用 API 创建新的模块、扩展现有模块的功能,或者与其他系统进行集成。 总结来说,Odoo 的系统架构包括前端、Web 服务器、Odoo 服务器、数据库、模块、业务逻辑和 API。它提供了一个灵活、可扩展的平台,满足企业各种不同的业务需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值