js 模块化规范

文章介绍了JavaScript模块化的发展,重点讲解了ES6的默认导出与按需导入,以及import()函数的动态加载特性。对比了静态的import...from与动态的import(),并提到了CommonJS和AMD两种早期的模块化规范。
摘要由CSDN通过智能技术生成

为啥要需要模块化开发?

在ES6之前,JavaScript并未提供一种原生的、语言级别的模块化组织模式,而是将模块化的方法交由开发者来实现。因此出现了很多种JavaScript模块化的实现方式,比如,CommonJS、AMD、CMD等

Es6规范

1.默认导出export-default.js整体导出只能用一次:

默认导出:export default 默认导出成员

例如:

  let a =10
  let c = 20
  let d = 30
  function show(){}
  export default{
    a,c,show
  }

默认导入:import 接收名称 from ‘模板标识符’

例如:

  import m1 from './m1.js'  //JS文件相对路径
  console.log(m1)
  {a:10,c:20,show:[Function:show]}

2.按需导出与按需导入:

按需导出:

export let s1 = 10

按需导入:

import { s1 } from './moud.js'

as为导出变量重新命名

 // 例如:导入
  let a =10
  let c = 20
  let d = 30
  function show(){}
  export default{
    a,c,show
  }
  export let s1 = 30
  export let s2 = 20
  export function say() { }
  //例如:导出
  import m1,{s1,s2 as ss2,say} from './m1.js'   //JS文件相对路径
  console.log(m1)
  console.log(s1)
  console.log(ss2)
  console.log(say)

import()

import() 函数 是动态加载的,对标 nodejs 中的 require() 。

import() 返回一个 Promise 对象。

两者比较

import...from 是静态的,import()函数 是动态的
import ... from 命令会被 JavaScript 引擎静态分析,先于模块内的其他语句执行。所以,下面的代码会报错。

// 报错
if(x === 2) {
  import MyModual from './myModual'
}
上面代码中,引擎处理 import 语句是在编译时,这时不会去分析或执行 if 语句,所以 import 语句放在 if 代码块之中毫无意义,因此会报句法错误,而不是执行时错误。也就是说,import 和 export 命令只能在模块的顶层,不能在代码块之中(比如,在 if 代码块之中,或在函数之中)。

在 nodejs 中,require 是运行时加载模块,import 命令无法取代 require 的动态加载功能。
const path = '.' + fileName;
const myModual = require(path);
所以,import() 函数就这样被提出来了。

import() 函数可以用在任何地方,不仅仅是模块,非模块的脚本也可以使用。它是运行时执行,也就是说,什么时候运行到这一句,就会加载指定的模块。另外,import() 函数与所加载的模块没有静态连接关系,这点也是与 import...from 语句不相同。

import() 函数类似于 Node 的 require 方法,区别主要是前者是异步加载,后者是同步加载。

import() Tips

//import() 函数加载模块成功以后,这个模块会作为一个对象,当作 then 方法的参数。因此,可以使用对象解构赋值的语法,获取输出接口。
import('./myModule.js')
.then(({export1, export2}) => {
  // ...
})

//import 函数也可以用在 async 函数之中。
async function main() {
  const myModule = await import('./myModule.js');
  const {export1, export2} = await import('./myModule.js');
  const [module1, module2, module3] =
    await Promise.all([
      import('./module1.js'),
      import('./module2.js'),
      import('./module3.js'),
    ]);
}
main();

commonJS规范

  //nodejs遵循的模块化规范:
  //导出:
  module.exports=function(x){console.log(x);};
  //导入:
   var example = require('./example.js'); 

AMD规范

  //早期的异步模块化规范:
  define(['package/lib'],function(lib){
  functionfoo(){
  lib.log('hello world!');
  }
  return{foo:foo};
  });

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值