es6(六):module模块(export,import)

es6之前,社区模块加载方案,主要是CommonJS(用于服务器)和AMD(用于浏览器)

而es6实现的模块解决方案完全可以替代CommonJS和AMD

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

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

同时:模块中使用的是严格模式

<script type="module" src="es7-1.js" ></script>
  <script type="module" src="es7-2.js" ></script>
  <!-- 页面渲染完成再去加载,相当于设置了defer,不会造成浏览器阻塞 -->

用script引入模块文件时,需要加上type="module"

这里补充一下defer和async属性:

1 <script src="a.js" async></script>

设置了async属性后,浏览器加载页面的过程是:渲染引擎开始渲染,发现设置async属性的脚本,继续渲染,同时下载脚本,当脚本下载完成,渲染引擎将浏览器控制权脚本JS引擎,执行脚本。因为可能会遇见多个脚本,同时脚本的下载时间有长有短,所以脚本执行顺序可能不是脚本书写的顺序!

设置defer属性,浏览器的工作情况:前面与上面类似,不过当发现脚本,渲染引擎会继续渲染页面,直到页面渲染完成,再将浏览器控制权交给JS引擎,执行脚本;所以脚本执行顺序与脚本书写的顺序一致。这种与在页面底部引入的脚本文件作用类似!

如果均未设置以上属性,浏览器工作情况:渲染引擎开始渲染,发现脚本,将浏览器控制权脚本js引擎,下载脚本,执行脚本,结束后JS引擎再将浏览器控制权交给渲染引擎,渲染引擎继续渲染。。。

export:导出变量,函数,类等

第一种写法:

1 export let name=‘apple‘
2 export let age=100
3 export let year=2017

第二种写法:更推荐(在最下面使用export导出,能看出究竟哪些变量或其他类型被导出,更直观

1 let name1=‘apple‘
2 let age1=100
3 let year1=2017
4 export {name1,age1,year1}

还可以用as重命名,类似sql语句

1 export {name1 as a,age1 as b}

注意下面这种情况:

1 let a1=function (){}
2 // export a1//错误的写法
3 export {a1}

也就是说export时要提供对外的接口

1 export function f(){}//正确写法
2 function f1(){}
3 // export f1//错误写法

同时注意:export必须放在模块顶层,不得放入块级作用域内(报错),因为无法做静态优化;

export default可以用在匿名函数之前;当然也可以放在不是匿名函数之前

1 export default function(){}
2 // 而导入时,可以import abc from ‘./es7-2‘ 注意此时的abc没有用大括号括起来,abc可以为任意有效变量名
3 // 总体来说export default后, import后面可以加上任意变量名,比较方便

import:当export导出了模块的对外接口,此时就可以用import导入接口(加载导出的模块)

1 import {name1,age1,year1} from ‘./es7-1.js‘
2 console.log(name1,age1,year1)//apple 100 2017
3 // form后面路径可以是相对路径也可以是绝对路径,.js后缀可以省略
4 // 但是我开apache时,省略js报错了,同时如果script是行内引用的话,必须加.js后缀,所以建议任何时候都加上后缀

同理import导入时也可以用as重命名:

1 import {name1 as a1}

同时由于import是静态执行,所以不得对import使用表达式、变量等操作;因为这些都是在运行时执行,并不是编译时(静态)执行

时间: 2024-08-06 19:21:53

es6(六):module模块(export,import)的相关文章

(转)关于ES6的 模块功能 Module 中export import的用法和注意之处

关于ES6的 模块功能 Module 中export import的用法和注意之处 export default 的用法 export default命令用于指定模块的默认输出.显然,一个模块只能有一个默认输出,因此export deault命令只能使用一次.所以,import命令后面才不用加大括号,相反其它的export 输出 可以有多个,且import时必须加大括号,示例如下: 1 // modules.js 2 function add(x, y) { 3 return x * y; 4

ES6 模块export import

在 ES6 前, 实现模块化使用的是 RequireJS 或者 seaJS(分别是基于 AMD 规范的模块化库, 和基于 CMD 规范的模块化库).ES6 引入了模块化,其设计思想是在编译时就能确定模块的依赖关系,以及输入和输出的变量.ES6 的模块化分为导出(export) @与导入(import)两个模块. ES6 的模块自动开启严格模式,不管你有没有在模块头部加上 use strict;.模块中可以导入和导出各种类型的变量,如函数,对象,字符串,数字,布尔值,类等.每个模块都有自己的上下文

ES6学习笔记&lt;五&gt; Module的操作——import、export、as

import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小工程,再用一种简单的方法把这些小工程连接在一起. 这有可能导致两个问题: 一方面js代码变得很臃肿,难以维护 另一方面我们常常得很注意每个script标签在html中的位置,因为它们通常有依赖关系,顺序错了可能就会出bug 在es6之前为解决上面提到的问题,我们得利用第三方提供的一些方案,主要有两种

ES6 module模块

模块Module  模块Module:一个模块,就是一个对其他模块暴露自己的属性或者方法的文件. 在这里,我们会把module-A.js和module-B.js分别当作两个模块(moduleA模块和moduleB模块)来对待和处理.用这两个模块来演示如何暴露一个模块的属性或方法. 导出Export 导出Export:作为一个模块,它可以选择性地给其他模块暴露(提供)自己的属性和方法,供其他模块使用. 导入Import 导入Import:作为一个模块,可以根据需要,引入其他模块的提供的属性或者方法

amd cmd commonjs 模块规范 和 es6 的 module 语法

js的模块化 在前端开发的原始时期,只要在script标签中嵌入js代码就能实现一些基本的交互效果,但是随着时代的进步.js扮演的角色变得重要起来,js应用的场景页越来越复杂,.然而,js都没有类的概念,更不用说模块了. 为什么要有模块化 当一个项目变得复杂的时候,会出现问题,比如:命名冲突:开发中重复命名,导致命名冲突.文件依赖:项目开发中,依赖的js文件,引入遗漏,引入顺序错误. 使用模块化开发可以避免类似情况,而且利于项目的维护:提升开发效率:代码方便重用,能直接引入,避免重复开发.方便后

彻底搞懂 module.exports/exports/import/export/export default

module.exports/exports module.exports 是模块系统创建的(全局内置对象):当你创建完成一个模块时,需要将此模块暴露出去,以便使用:module.exports 便提供了暴露出去的接口方法: 例如暴露出去一个对象(暴露一个全局变量或方法): /**创建模块 module.exports.js */ let object = { name: 'zhangsan', age: 24, hasSay: () => { console.info('This is zha

ES6之module

一.module概述 JavaScript一直没有模块体系,但是伴随着ES6的到来,module随之而来. ES6module的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入.输出变量.简而言之就是‘编译时加载’. ES6module相对来说实现得还是比较简单,易上手. ES6module提倡一个js文件就是一个模块的概念,主要包括两个命令:export和import,用于模块向外提供接口(export)和引入其他模块接口(import). 好了,下面就说下我说理解的expo

react开发中如何使用require.ensure加载es6风格的模块

1.问题提出:想通过require.ensure加载es6风格的模块? 2.出现问题:import方式本身就是静态设计方式.如果require进来的是commonjs模块或者amd则没问题,但项目只想es6一个书写风格,行吗? 遗憾的是:一般语言编译工具(如babel),不支持直接require一个es6风格的React组件. 怎么办?? 3.react代码分割方式: react代码分割常见使用router方式,但是单页面应用,不打算router下,可以用require.ensure进行按需加载

前端模块化小总结—commonJs,AMD,CMD, ES6 的Module

随着前端快速发展,需要使用javascript处理越来越多的事情,不在局限页面的交互,项目的需求越来越多,更多的逻辑需要在前端完成,这时需要一种新的模式 --模块化编程 模块化的理解:模块化是一种处理复杂系统分解为更好的可管理模块的方式.简单来说就是解耦,简化开发,一个模块就是实现特定功能的文件,可以更方便地使用别人的代码,想要什么功能,就加载什么模块.模块开发需要遵循一定的规范 CommonJS规范 CommonJS就是一个JavaScript模块化的规范,是用在服务器端的node的模块规范,