模块化 (ESM) --- day02

ESM: es6 module规范及其实现; -----> web统一的前端规范

  ES6 模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。

      CommonJS 和 AMD 模块,都只能在运行时确定这些东西。

核心:

  独立作用域的

  export导出模块内数据     ---> export

  import引入模块数据       ---> 静态:import  只能放在文件开头     引申:   import()函数动态引入 ,返回 Module 对象

使用:

  <script  type = "module">

    // 这段代码 当做一个模块使用

  </script>

  type = "module" 作用:

    声明这是一个模块

    具有独立的作用域

    使用 严格模式  “use strict”

数据的导出: (es6 module 标准:web环境 和 nodejs环境 )

  export var a = 1;     <<===========>>  var a = 1; export { a };

  export var obj = { a:1 }  <<===========>>  var obj = { a:1 }; export { obj }

  export var funcName = function(){}   <<===========>> var funcName = function(){}' export { funcName };

  ----------------------------------------------------->  export { 表达式 }

  导出多个:  export { a, b, c, d}

  导出接口别名: export { a as s }      s 是 a 的别名

  导出默认接口: export default    ----->   export default  var a = 1;

数据的引入: 

   import   先于模块内的其他模块执行( 会被js引擎静态分析)

  import variable from “文件路径”

  es6模块的实现是静态加载,import命令无法替代requrie的动态加载  -----> 提案中 引入了 import()  函数

  静态加载:  import

       编译时加载

       只能在顶层结构中,否则报错 (编译错误,放在动态语句中报错,如 if语句)

       获取的是模块接口的引用

  动态加载: import()   ( 解决动态加载的问题)

       运行时加载

       import() 返回一个 Promise 对象

       模块、非模块脚本都可以加载

       导入的是一个 Module 对象, 当做 then 回调的参数

    btn.onclick = async function(){

      let cssModule = await  import(“./m1.css”);  // 返回一个promise 对象

      let css = cssModule.default;

    }

无关的补充:

  commonjs规范:一个文件是一个模块,module函数,每个文件都是module的实例;module.exports 数据的导出

  nodejs 的 require方法 是运行时加载的 

  import命令无法替代 require的动态加载功能   ---> import()来实现动态加载

  

 

posted @ 2020-02-29 23:10  铁塔  阅读(544)  评论(0编辑  收藏  举报