js模块导入/导出大全

  module.exports与exports是CommonJS的规范
  
  export与export default是es6规范
  
  require 是 AMD规范引入方式
  
  import是es6的一个语法标准
  
  module.exports与exports
  
  module变量代表当前模块。这个变量是一个对象,module对象会创建一个叫exports的属性,这个属性的默认值是一个空的对象;
  
  module.exports.aa="我是aa";
  
  module.exports.bb="我是bb";
  
  //上边这段代码就相当于一个对象
  
  {
  
  "aa":"我是aa",
  
  "bb":"我是bb",
  
  }
  
  引用方法
  
  var req=require("./app.js");
  
  req.aa      //这个值是 "我是aa"
  
  而exports只是module.exports的一个引用,可以理解为:
  
  var exports = module.exports;
  
  但是这个两个还是有一定区别的,因为exports只是module.exports的一个引用,所以module.exports可以导出一个匿名函数,而exports不可以。因为这会切断和modeule.exports的联系。
  
  如果不是很理解的话,下面举例说明(需要先明白引用数据类型和基础数据类型):
  
  var m={}
  
  m.e1={}
  
  var e2=m.e1;
  
  e2.aa=1
  
  console.log(m.e1.aa)//打印1
  
  e2=function(){
  
  return 123;
  
  }
  
  console.log(m.e1)//打印{aa:1}
  
  console.log(e2)//打印 ƒ (){return 123;}
  
  //也就是说如果给exports导出匿名函数,就会重写exports引用地址指向
  
  也就是说也不能这样写exports= {www.kunlunyulegw.com name,say },它同样会改变exports地址指向
  
  !
  
  export与export default
  
  二者的区别有以下几点:
  
  export default在一个模块中只能有一个,当然也可以没有。export在一个模块中可以有多个。
  
  export default的对象、变量、函数、类,可以没有名字。export的必须有名字。
  
  export default对应的import和export有所区别
  
  1.export写法
  
  var name="我是电脑";
  
  var say=function(www.jiuyueguojizc.cn){
  
  console.log("我可以干很多事");
  
  }
  
  export {name,say};
  
  //也可以直接一个一个的export但是必须得有名字
  
  export const a=1;
  
  export function data(www.tianhyLzc.cn){
  
  return data;
  
  }
  
  //其他页面引入时必须这样
  
  import {name,say} from "www.moyoupintai.cn./app.js"
  
  2.export default
  
  //可以没有函数名字
  
  export default function(www.jinyang3.xyz){
  
  return data;
  
  }
  
  //这里export不能这样导出
  
  export default const a=12;//报错
  
  //应该这样导出
  
  const a=12;
  
  export default a
  
  //其他页面引入时必须这样
  
  import data from "www.hdptzc.cn./app.js"
  
  import和require
  
  调用时间
  
  require是运行时调用,所以require理论上可以运用在代码的任何地方
  
  import是编译时调用,所以必须放在文件开头
  
  本质
  
  require是赋值过程,其实require的结果就是对象、数字、字符串、函数等,再把require的结果赋值给某个变量
  
  import是解构过程,但是目前所有的引擎都还没有实现import,我们在node中使用babel支持ES6,也仅仅是将ES6转码为ES5再执行,import语法会被转码为require
  
  对比
  
  require/exports
  
  遵循 CommonJS/AMD,只能在运行时确定模块的依赖关系及输入/输出的变量,无法进行静态优化
  
  用法只有以下三种简单的写法:
  
  const fs = require('fs')
  
  exports.fs = fs
  
  module.exports = fs
  
  import/export
  
  遵循 ES6 规范,支持编译时静态分析,便于JS引入宏和类型检验。动态绑定。
  
  写法就比较多种多样:
  
  import fs from www.huanhua2zhuc.cn'fs'
  
  import {default as fs} from 'fs'
  
  import * as fs from 'fs'
  
  import {readFile} from 'fs'
  
  import {readFile as read} from 'fs'
  
  import fs, {readFile} from 'fs'
  
  export default fs
  
  export const fs
  
  export function readFile
  
  export {readFile, read}
  
  export * from 'fs'
  
  注意
  
  通过require引入基础数据类型时,属于复制该变量。
  
  通过require引入复杂数据类型时,数据浅拷贝该对象。
  
  出现模块之间的循环引用时,会输出已经执行的模块,而未执行的模块不输出(比较复杂)
  
  CommonJS模块默认export的是一个对象,即使导出的是基础数据类型

你可能感兴趣的:(js模块导入/导出大全)