ES6 modules 详解
概述
历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。其他语言都有这项功能,比如 Ruby 的require、Python 的import,甚至就连 CSS 都有@import,但是 JavaScript 任何这方面的支持都没有,这对开发大型的、复杂的项目形成了巨大障碍。
在 ES6 之前,社区制定了一些模块加载方案,最主要的有 CommonJS 和 AMD 两种。前者用于服务器,后者用于浏览器。ES6 在语言标准的层面上,实现了模块功能,而且实现得相当简单,完全可以取代 CommonJS 和 AMD 规范,成为浏览器和服务器通用的模块解决方案。
ES6 模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS 和 AMD 模块,都只能在运行时确定这些东西。比如,CommonJS 模块就是对象,输入时必须查找对象属性。
下面介绍一下es6的简单使用。
1. 引入模块
首先在根目录的src文件夹下创建一个test.js和index.js,在test.js中我们随便干点什么简单的事情即可。
// src/test.js
console.log('first module');
在index.js中通过import引入test.js,这是我们要学会的第一个语法
// src/index.js
import test from './test' console.log(test);
- import表示引入一个模块,
- test 我们暂时理解为引入模块的名字,
- from表示从哪里引入
- ./test为./test.js的简写,表示将要引入模块的路径
引入这个动作执行时,test.js中的代码也执行了。由于在test.js中并没有对外暴露任何接口,因此index.js中的test为一个空对象,那么对外暴露接口的方式,则是我们要学习的第二个语法。
2. 对外提供接口
ES6 modules使用export关键字对外提供接口,在我们刚才创建的test.js中,我们添加如下代码
const num = 20;
const arr = [1, 2, 3, 4];
const obj = {
a: 0,
b: function() {}
}
const foo = () => {
const a = 0;
const b = 20;
return a + b;
} export default {
num,
arr,
obj,
foo
}
在test.js中,我们使用export default对包暴露了一个对象。他的意思就是当我们使用import test from ‘./test’时,这个test对象就默认等于export default暴露的对象。
我们还可以在test.js中,仅仅通过export暴露几个方法与属性,我们来看看index.js中test会变成什么样子。
// src/test.js
export const bar = () => {}
export const zcar = 12345;
保存运行后,我们发现,index.js中的test对象并没有变化,因为它仅仅等于export default抛出的对象,因此,为了获得模块test.js暴露的所有接口,我们得通过如下的方式。
// src/index.js
import * as test from './test';
其中的 表示所有,这是比较常用的通配符,as表示别名, as test的意思是将test.js暴露的所有接口组成的对象,命名为test。那么我们在index.js中log出test,结果就如下。

如果大家对ES6解析结构的语法熟悉,那么对于如下的用法相信就不难理解。
/ src/index.js
import test, { bar, zcar } from './test'; console.log(test);
console.log('bar:', bar);
console.log('zcar:', zcar);
test,仍然表示为export default暴露的对象,而 { bar, zcar }则表示利用解析结构的语法,从整个返回对象中去取得对应的接口。输出结果也就很清晰了。

这种方式还是比较常见,比如我们在使用vuex时,常常这样使用:
import { mapMutations } from "Vuex";
它其实暗示了vuex的封装方式,也暗示了我们应该如何去封装我们的模块。
这里我们能够直接引入vuex的原因,是因为我们将它安装到了文件夹node_modules中,该文件夹中安装的所有模块都可以这样直接引用。例如我们安装一个jquery。
// 安装jquery
> npm install jquery
然后在其他模块中就可以直接引入
import $ from 'jquery'
这样,我们可以和往常一样使用jquery。
通过这样方式,我们还可以扩展更多的库,这就使得我们这个开发环境不仅仅能够用于vue的开发,怎么用,完全取决与你自己。
结束语
ES6 模块的基础语法大概就这些吧,他告诉了我们在ES6中,一个模块应该如何对外暴露接口与如何引入其他模块暴露的接口,这个知识点在实际开发中非常常用,因此虽然简单,但是不得不掌握,这也是大家进一步学习react或者vue的基础,主要的难点大概在于本地开发环境的折腾,如果你是初次折腾这些,可能会遇到一些小问题,所以一定要有一点耐心。
ES6 modules 详解的更多相关文章
- es6语法详解
什么是ECMAScript? ECMAScript是浏览器脚本语言的规范,而我们熟知的js语言,如JavaScript则是规范的具体实现.es6就好比Java的jdk. 一.es6语法详解:let声明 ...
- Es6主要特征详解
一.简介 本文将对es6的最佳特性进行分享和讲解.es6也称ES6/ECMAScript2015,在2015年诞生,但是目前实际开发中还很多用的是ES5(2009年),原因就是很多的浏览器不支持新的语 ...
- ES6 Promise 详解
一.概念 Promise,从语法上来讲,它是一个对象,是一个构造函数,可以获取 异步操作 的信息. 简单来讲,就是用同步的方式写异步代码,用来解决回调问题. 二.特点 Promise 对象有两个特点: ...
- 转 : CSS Modules详解及React中实践
https://zhuanlan.zhihu.com/p/20495964 CSS 是前端领域中进化最慢的一块.由于 ES2015/2016 的快速普及和 Babel/Webpack 等工具的迅猛发展 ...
- 写GULP遇到的ES6问题详解
Gulp.js 是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务.最近复习一下gulp一些基本的写法,在写了一些简单的uglify,rename,concat,clean的处理之 ...
- vue--vuex 中 Modules 详解
前言 在Vue中State使用是单一状态树结构,应该的所有的状态都放在state里面,如果项目比较复杂,那state是一个很大的对象,store对象也将对变得非常大,难于管理.于是Vuex中就存在了另 ...
- ES6 Promise详解
前言 本文主要是对Promise本身的用法做一个全面解析而非它的原理实现,如果你对Promise的用法还不是很熟悉或者想加深你对Promise的理解,我相信这篇文章一定会帮到你. 首先让我们先了解一下 ...
- 详解 ES6 Modules
详解 ES6 Modules 对于新人朋友来说,想要自己去搞定一个ES6开发环境并不是一件容易的事情,因为构建工具的学习本身又是一个非常大的方向,我们需要花费不少的时间才能掌握它. 好在慢慢的开始有大 ...
- 前端基础进阶(十五):详解 ES6 Modules
对于新人朋友来说,想要自己去搞定一个ES6开发环境并不是一件容易的事情,因为构建工具的学习本身又是一个非常大的方向,我们需要花费不少的时间才能掌握它. 好在慢慢的开始有大神提供了一些非常简单易懂,学习 ...
随机推荐
- [置顶]
Java WebService接口生成和调用 图文详解
webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...
- 【NOIP2015提高组】跳石头
https://www.luogu.org/problem/show?pid=2678 最小值最大问题,二分答案.每次检查是否能仅移走m块岩石使得所有跳跃距离均大于等于mid. #include &l ...
- Jarvis OJ - [XMAN]level3 - Writeup——ret2libc尝试
这次除了elf程序还附带一个动态链接库 先看一下,很一般的保护 思路分析 在ida中查看,可以确定通过read函数输入buf进行溢出,但是并没有看到合适的目标函数 但是用ida打开附带的链接库,可以看 ...
- PHP之外观模式
外观(Facade)模式 当使用子系统的代码时,你也许会发现自己过于深入地调用子系统的逻辑代码.如果子系统代码总是在不断变化,而你的代码却又在许多不同地方与子系统代码交互,那么随着子系统的发展,你也许 ...
- 更便捷的css处理方式-postcss
更便捷的css处理方式-PostCSS 一般来说介绍一个东西都是要从是什么,怎么用的顺序来讲.我感觉这样很容易让大家失去兴趣,先看一下postcss能做点什么,有兴趣的话再往下看,否则可能没有耐心看下 ...
- 打印杨辉三角 --JS
var arr = new Array(); for(var i = 0 ;i < 6 ; i++){ if(i == 0){arr.push(1);} else if(i == 1){arr ...
- 浅析node.js
大家好,今天来给大家讨论node.js这个东西,说起这个东西啊,可能大家已经很熟悉了,因为现在市场上运用的越来越广泛,毕竟它的优点还是有目共睹的! 那么,什么是node.js呢?官方给出了这样的定义: ...
- (转)spring aop(下)
昨天记录了Spring AOP学习的一部分(http://www.cnblogs.com/yanbincn/archive/2012/08/13/2635413.html),本来是想一口气梳理完的.但 ...
- java类中获取ServletContext的方法
起因是我想要获取一个相对路径,需要用到servletContext的getRealPath()方法,于是上网搜索,找到两种方法来获取ServletContext. 方法1:第一种方法是这样的: Ser ...
- 微信小程序——轮播图实现
小程序的轮播图,也就是他其中的一个控件可以算是直接上代码: 这是WXML 页面 代码: <view class='carousel_div'> <swiper class=" ...