详解 ES6 Modules

对于新人朋友来说,想要自己去搞定一个ES6开发环境并不是一件容易的事情,因为构建工具的学习本身又是一个非常大的方向,我们需要花费不少的时间才能掌握它。

好在慢慢的开始有大神提供了一些非常简单易懂,学习成本非常低的解决方案来帮助大家学习。create-react-app就是这些解决方案中,个人认为最简单易懂的一种方式。

所以在学习ES6 modules之前,先跟大家介绍一下create-react-app的安装与使用。

尽管create-react-app的目的是用于开发react程序,但是我们仅仅只用来学习ES6是再合适不过了。当然你也可以借助vue-cli来学习,同样十分简单。

1、确保自己的本地环境已经安装了node与npm

通常安装的方式就是去node的官方网站下载安装,在安装node的时候,npm也会一起被安装。

下载地址: http://nodejs.cn/download/

2、安装一个好用的命令行工具

在windows环境下,系统默认的cmd非常难用,所以我个人比较推荐大家使用git.bash 或者 cmder。

git 下载地址: https://git-scm.com/downloads
在git安装目录下会有一个bash工具,找到安装目录直接使用即可。

cmder下载地址: http://cmder.net/

在mac上就方便很多了,你可以直接使用系统自带的terminal工具,就非常好用。但是一般我推荐大家使用iterm2,并安装oh my zsh插件。具体的配置大家可以自己去折腾,网上的教程应该足够帮助你搞定这一切了。

 

另外还强烈推荐一款超高颜值的终端工具 hyperTerm

这款工具的特色就是颜值高,第一感觉就是惊艳,大家不妨一试。

 
3、安装create-react-app

在命令行工具中使用查看版本的方式确保node与npm都安装好之后,我们就可以安装create-react-app了。

 
 
1
2
3
4
5
> node -v
// 输出node版本号
 
> npm -v
// 输出npm版本号

使用npm全局安装create-react-app

 
 
1
> npm install create-react-app -g

然后我们就可以使用create-react-app来创建我们的第一个项目。

找到一个你要存放项目的根目录,假设叫做develop,运行以下指令。

 
 
1
> create-react-app es6app

create-react-app会自动帮助我们在develop目录下创建一个叫做es6app的文件夹,这就是我们新创建的项目。

当项目创建完成之后,在命令行工具中,我们会看到如图所示的提示。这些提示告诉了我们如何运行项目npm start ,如何打包项目npm run build等,这里我就不再赘述。

 

项目创建完毕之后,进入该文件夹。

 
 
1
2
3
4
> cd es6app
 
// 查看文件夹里的内容
> ls

我们会发现里面有一个叫做package.json的文件,这个文件里包含了项目所需要的所有依赖。当我们第一次运行项目之前,还需要安装该文件里的依赖包。

 
 
1
> npm install

安装完毕之后,我们就可以启动该项目了。

 
 
1
> npm start

项目启动之后

一般来说,启动之后会自动在浏览器中打开。

项目首次启动的页面

create-react-app已经自动帮助我们实现了热更新,因此当我们修改代码时,浏览器会自动更新。当然,如果我们仅仅只是修改页面样式时,热更新将会非常方便,但是如果你正在进行单页面的组件开发,可能热更新能够提供的帮助非常有限。

4、认识项目

只要我们按照构建工具的规则进行开发,那么构建工具会自动帮助我们将代码进行整合,因此在该项目中开发时,我们并不需要自己来使用script或者link标签来引入js与css,所以认识create-react-app的规则就变得很重要。

初次创建的项目下,会有3个文件夹。

  • node_modules
    项目依赖包存放位置。当我们运行npm install安装package.json中的依赖包时,该文件夹会自动创建,所有的依赖包会安装到该文件夹里。
  • public
    主要的作用是html入口文件的存放。当然我们也可以存放其他公用的静态资源,如图片,css等。其中的index.html就是我们项目的入口html文件
  • src
    组件的存放目录。在create-react-app创建的项目中,每一个单独的文件都可以被看成一个单独的模块,单独的image,单独的css,单独js等,而所有的组件都存放于src目录中,其中index.js则是js的入口文件。虽然我们并没有在index.html中使用script标签引入他,但是他的作用就和此一样。

当然,如果我们要进一步进行react的学习,那么肯定需要了解多一点的规则,但是在学习react之前,我们还是先把ES6 modules的知识搞定在说吧,所以,接下来你要做的事情就是,删掉src目录里的除了index.js之外的所有文件,并清空index.js,我们从0开始学习ES6 modules。

为了确保程序仍然能够正常运行,我们在index.js中随便写点代码测试一下

 
 
1
2
const app = document.querySelector('#root')
app.innerHTML = '啊,全部被清空啦,准备工作终于做完了,可以开始学习ES6啦'

一切正常,程序变得普通了,我们更容易理解

那么我们就可以在这个环境下学习ES6的所有知识了,当然也包括ES6 modules。

ES6 modules

1. 引入模块

首先在src目录下创建一个test.js,在test.js中我们随便干点什么简单的事情即可。

 
 
1
2
// src/test.js
console.log('your first module');

在index.js中通过import引入test.js,这是我们要学会的第一个语法

 
 
1
2
3
4
// src/index.js
import test from './test'
 
console.log(test);
  • import表示引入一个模块,
  • test 我们暂时理解为引入模块的名字,
  • from表示从哪里引入
  • ./test./test.js的简写,表示将要引入模块的路径

结果是test中的代码执行,index.js中模块test为一个空对象

引入这个动作执行时,test.js中的代码也执行了。由于在test.js中并没有对外暴露任何接口,因此index.js中的test为一个空对象,那么对外暴露接口的方式,则是我们要学习的第二个语法。

2. 对外提供接口

ES6 modules使用export关键字对外提供接口,在我们刚才创建的test.js中,我们添加如下代码

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 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会变成什么样子。

 
 
1
2
3
// src/test.js
export const bar = () => {}
export const zcar = 12345;

保存运行后,我们发现,index.js中的test对象并没有变化,因为它仅仅等于export default抛出的对象,因此,为了获得模块test.js暴露的所有接口,我们得通过如下的方式。

 
 
1
2
// src/index.js
import * as test from './test';

其中的 * 表示所有,这是比较常用的通配符,as表示别名,* as test的意思是将test.js暴露的所有接口组成的对象,命名为test。那么我们在index.js中log出test,结果就如下。

看到结果,我们就很容易清楚的知道export与export default的区别与作用了,并且如何使用他们就变得很简单了

如果大家还记得前面一篇文章里,我所讲的ES6解析结构的语法,那么对于如下的用法相信就不难理解。

 
 
1
2
3
4
5
6
// 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 }则表示利用解析结构的语法,从整个返回对象中去取得对应的接口。输出结果也就很清晰了。

result

这种方式还是比较常见,比如我们在使用react时,常常这样使用:

 
 
1
import React, { Component } from 'react'

它其实暗示了React的封装方式,也暗示了我们应该如何去封装我们的模块。

这里我们能够直接引入react的原因,是因为我们将它安装到了文件夹node_modules中,该文件夹中安装的所有模块都可以这样直接引用。例如我们安装一个jquery。

 
 
1
2
// 安装jquery
> npm install jquery

然后在其他模块中就可以直接引入

 
 
1
import $ from 'jquery'

这样,我们可以和往常一样使用jquery。
通过这样方式,我们还可以扩展更多的库,这就使得我们这个开发环境不仅仅能够用于react的开发,怎么用,完全取决与你自己。

OK,ES6 模块的基础语法大概就这些吧,他告诉了我们在ES6中,一个模块应该如何对外暴露接口与如何引入其他模块暴露的接口,这个知识点在实际开发中非常常用,因此虽然简单,但是不得不掌握,这也是大家进一步学习react或者vue的基础,主要的难点大概在于本地开发环境的折腾,如果你是初次折腾这些,可能会遇到一些小问题,所以一定要有一点耐心。

详解 ES6 Modules的更多相关文章

  1. 前端基础进阶(十五):详解 ES6 Modules

    对于新人朋友来说,想要自己去搞定一个ES6开发环境并不是一件容易的事情,因为构建工具的学习本身又是一个非常大的方向,我们需要花费不少的时间才能掌握它. 好在慢慢的开始有大神提供了一些非常简单易懂,学习 ...

  2. 详解ES6中的 let 和const

      前  言 JRedu ECMAScript 6 是 JavaScript 语言教程,全面介绍 ECMAScript 6 新引入的语法特性. ES6 与上一个版本 ES5 的所有不同之处,对涉及的语 ...

  3. 详解es6 class语法糖中constructor方法和super的作用

    大多数面向对象的编程语言都支持类和类继承的特性,而JS却不支持这些特性,只能通过其他方法定义并关联多个相似的对象,这种状态一直延续到了ES5.由于类似的库层出不穷,最终还是在ECMAScript 6中 ...

  4. 详解es6中Proxy代理对象的作用

    在es6中新添加了Proxy,那么它有什么作用啊?Proxy本意为代理,而es6中的Proxy也就是代理对象,那么代理对象感觉听起来很模糊,在这里就解释一下Proxy代理对象的作用. Proxy的主要 ...

  5. 从原理到应用,Elasticsearch详解

    简介 Elasticsearch(简称ES)是一个分布式.可扩展.实时的搜索与数据分析引擎.ES不仅仅只是全文搜索,还支持结构化搜索.数据分析.复杂的语言处理.地理位置和对象间关联关系等. ES的底层 ...

  6. ES6 modules 详解

    概述 历史上,JavaScript 一直没有模块(module)体系,无法将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来.其他语言都有这项功能,比如 Ruby 的require.Pytho ...

  7. ES6,ES2105核心功能一览,js新特性详解

    ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...

  8. [js高手之路] es6系列教程 - 对象功能扩展详解

    第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...

  9. [js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解

    接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...

随机推荐

  1. 北京Uber优步司机奖励政策(1月8日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  2. 全球订单最多的成都优步推出"南北通勤线"业务

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. springboot+websocket+sockjs进行消息推送【基于STOMP协议】

    springboot+websocket+sockjs进行消息推送[基于STOMP协议] WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就 ...

  4. FPGA代码一位半加器入门-第2篇

    1. 代码比较简单,总结起来是用逻辑运算替代了数学运算加减,应该是因为这样的逻辑资源耗费的少.S是A+B的个位,CO是A+B的进位. module half_adder(A,B,S,CO); inpu ...

  5. 绝地求生大逃杀BE启动失败,应用程序无法正常启动

    今日更新绝地求生大逃杀后部分客户反馈绝地求生点击启动提示BE安装,应用程序无法启动 问题原因:经过排查发现,客户开启过超级工作站运行过游戏,在系统镜像包中保留了旧版的BE服务,致使新版BE无法安装,冲 ...

  6. dva webpack 利用require.context加载多个model

    dva redux数据管理都在models,根据业务不同models可能会有几十甚至上百的 [模块.js], 每次在index.js使用 app.model(require('./models/exa ...

  7. Linux命令应用大词典-第10章 Shell相关命令

    10.1 commond:抑制正常的Shell函数查找 10.2 exec:使用执行命令替换当前的shell进程 10.3 bash:GNU的Bourne-Again Shell解释器 10.4 bu ...

  8. JS原型链与继承别再被问倒了

    原文:详解JS原型链与继承 摘自JavaScript高级程序设计: 继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实 ...

  9. 变量不加 var 声明——掉进坑中,无法自拔!

    整整一下午,都在解决 window.onresize 中方法丢失不执行的问题!姿势固定在电脑前,颈椎病都犯了. 前些日子与大家分享了一下关于 防止jquery $(window).resize()多次 ...

  10. 正则表达式 和 re 模块

    正则表达式究竟是什么? 在一些网站注册的时候需要输入手机号码,当你输入一个错误的手机号码的时候,会提示你输入的手机号码格式错误 那么他究竟是如何判断的呢? 我们用Python代码进行表示: phone ...