【问题】前端模块化

一、关于模块化

1. 发展
  1. JS的诞生
    JS最开始只是为了实现简单的页面交互逻辑。
  2. 简单命名空间
    使用对象封装,要求定义的最外层的变量不能重复
var boy = {
  name: "James",
  age: 23
};
var girl= {
  name: "Mary",
  age: 21
};
console.log(boy .name); // James
console.log(girl.name); // Mary
  1. IIFE 立即调用函数表达式
    著名的JQuery就是的
(function (window) {
  // 变量定义
  var name = "James";
  // 操作方法
  var getName= function () {
    return name;
  }
  // 暴露对象
  window.boy = {
    getName: getName
  }
})(window);
2. 概念

模块化,将某一块功能的 JS 代码独立出来,成为一个单独的整体。

3. 优点
  • 避免变量命名冲突和污染。
  • 提高复用性。
  • 方便维护和管理。
4. 缺点
  • 需要引用很多文件,依赖关系与引入顺序强相关。
  • 程序复杂了以后,依然难以维护和管理。

三、ES6 中的模块

ES6 引入了模块的概念,使用关键字 import,export,default
模块的语法可以参考 这里

1. 设计思想
  • ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。
  • 这种加载称为“编译时加载”或者静态加载,即 ES6 可以在编译时就完成模块加载,效率要比 CommonJS 模块的加载方式高。
  • 由于 ES6 模块是编译时加载,使得静态分析成为可能。有了它,就能进一步拓宽 JavaScript 的语法,比如引入宏(macro)和类型检验(type system)这些只能靠静态分析实现的功能。
  • ES6 模块不是对象,而是通过export命令显式指定输出的代码,再通过import命令输入。
  • 一个模块就是一个独立的文件。该文件内部的所有变量,外部无法获取。
    如果你希望外部能够读取模块内部的某个变量,就必须使用 export 关键字输出该变量,使用 import 关键字输入该变量。
2. export 命令
 export 命令用于规定模块的对外接口。
 export 命令可以出现在模块的任何位置,只要处于模块顶层就可以。
 export命令规定的是对外的接口,必须与模块内部的变量建立一一对应关系。

直接输出变量

export var name = 'ZhangLiang';
export var age = 65;

直接输出函数

export function sum(x, y) {
  return x + y;
};

整组输出(必须使用大括号)

var name = 'ZhangLiang';
var age = 65;
function sum(x, y) {
  return x + y;
}
export {
  name,
  age,
  sum
}

重命名

var name = 'ZhangLiang';
var age = 65;
function sum(x, y) {
  return x + y;
}
export {
  name as exportName,
  age,
  sum as selfSum
}
3. export default 命令
export default命令用于指定模块的默认输出。显然,一个模块只能有一个默认输出,因此export default命令只能使用一次。 
这时import命令后面,不使用大括号。
其他模块加载该模块时,import命令可以为该匿名函数指定任意名字。 

直接输出变量

// 输出
export default var name = 'ZhangLiang';
// 输入
import customName from './xxx.js';

最后输出变量(不使用大括号)

// 输出
function sum(x, y) {
  return x + y;
}
export default sum;
// 输入
import sum from './xxx.js';
4. import命令
 import 命令用于输入其他模块提供的功能。
 import 命令可以出现在模块的任何位置,只要处于模块顶层就可以。
 import 命令具有提升效果,会提升到整个模块的头部,首先执行。
 import 命令输入的变量都是只读的,因为它的本质是输入接口。

单个输入

import { name } from './xxx.js'
import { age } from './xxx.js'
import { sum } from './xxx.js'

整组输入(必须使用大括号)

import { name, age, sum  } from './xxx.js'

重命名

import { 
  name as importName,
  age,
  sum as selfSum
} from './xxx.js'
5. 模块的整体加载
整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。
一般都使用别名转一下。
import * from './xxx.js'
import * as famousPeople from './xxx.js'
console.log('姓名:' + famousPeople.name);
console.log('结果是:' + famousPeople.sum(2, 5));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值