37-module

一、为什么出现module
JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。

在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代现有的 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。

ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。

  1. 直接引入文件(就是执行一次js文件的内容)
import "./common/index.js" //写法1
import "./common"  //写法2 默认是index.js
//import './common/index.css'  引入css
  1. export 单个抛出(注意写法)

//正确写法
export let a = 10;
export function fn(){
    console.log("我是一个抛出函数")
}

//错误写法
const let event = ()=>{
    console.log("event")
}
export event;  

单个按需引入

import {a,fn} from './common';
console.log(a)
fn()
/*名字必须要求和抛出的名字一一对应,如果不一样则报错,这样的话,
当其他人修改函数名字或者变量名字时,我也需要相应的改名,
比较麻烦改,这时候可以利用给整体别名的方式来解决*/

引入所有并且整体起别名

import * as obj from './common';
console.log(obj.a)
obj.fn()
  1. export default 抛出

当一次性抛出所有:

//一次性抛出所有
let a = 10;
function fn(){
    console.log("我是一个抛出函数")
}
export default {
    a,
    fn
}

引入

//在其他文件引入
import obj from './common';
console.log(obj.a)
obj.fn()

当抛出一个:

function fn(){
    console.log("我是一个抛出函数")
}
export default fn;

引入(在其他文件引入的时候名字不必保持一致)

//在其他文件引入
import fn_e from './common';   
fn_e()

总结:

  1. 当我直接import "xxx.js",相当于引入js文件执行一次js文件内容;

  2. 当我使用export 抛出的时候,可以逐个抛出文件(注意写法,看⬆️),在引入的时候import {x,fn} from "xxx.js"按需引入,使用的时候 console.log(x); fn();
    但是这时候引入文件和抛出文件的名字必须保持一样,这样其他人修改了名字的时候我也必须修改,如果是多个文件就比较麻烦,这时候可以给整体起别名,看

  3. 当我使用export 抛出的时候,在引入的时候可以整体起别名import * as from "xxx.js",使用的时候obj.x、obj.fn();

  4. 当我使用export default {a:a,fn:fn}抛出整体的时候,在引入的时候
    import obj from "xxx.js";使用的时候obj.a、obj.fn();

  5. 当我使用export default fn抛出一个时候,在引入的时候import fn_e from "xxx.js";这时候引入的时候和抛出的时候名字可以不一样。

注意:只要用export抛出的时候才有按需引入

你可能感兴趣的:(37-module)