30分钟快速入门掌握ES6/ES2015的核心内容(下)


Posted in Javascript onApril 18, 2018

前言

在 30分钟掌握ES6/ES2015核心内容(上)我们讲解了es6最常用的一些语法:let, const, class, extends, super, arrow functions, template string, destructuring, default, rest arguments

俗话说打铁要趁热,今天我们继续讲es6其他几个非常有用的新特性。

import export

这两个家伙对应的就是es6自己的module功能。

我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小工程,再用一种简单的方法把这些小工程连接在一起。

这有可能导致两个问题:

  • 一方面js代码变得很臃肿,难以维护
  • 另一方面我们常常得很注意每个script标签在html中的位置,因为它们通常有依赖关系,顺序错了可能就会出bug

在es6之前为解决上面提到的问题,我们得利用第三方提供的一些方案,主要有两种CommonJS(服务器端)和AMD(浏览器端,如require.js)。

如果想了解更多AMD,尤其是require.js,可以参看这个教程:why modules on the web are useful and the mechanisms that can be used on the web today to enable them

而现在我们有了es6的module功能,它实现非常简单,可以成为服务器和浏览器通用的模块解决方案。

ES6模块的设计思想,是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。CommonJS和AMD模块,都只能在运行时确定这些东西。
上面的设计思想看不懂也没关系,咱先学会怎么用,等以后用多了、熟练了再去研究它背后的设计思想也不迟!好,那我们就上代码...

传统的写法

首先我们回顾下require.js的写法。假设我们有两个js文件: index.js和content.js,现在我们想要在index.js中使用content.js返回的结果,我们要怎么做呢?

首先定义:

//content.js
define('content.js', function(){
 return 'A cat';
})

然后require:

//index.js
require(['./content.js'], function(animal){
 console.log(animal); //A cat
})

那CommonJS是怎么写的呢?

//index.js
var animal = require('./content.js')

//content.js
module.exports = 'A cat'

ES6的写法

//index.js
import animal from './content'

//content.js
export default 'A cat'

以上我把三者都列出来了,妈妈再也不用担心我写混淆了...

ES6 module的其他高级用法

//content.js
export default 'A cat' 
export function say(){
 return 'Hello!'
} 
export const type = 'dog'

上面可以看出,export命令除了输出变量,还可以输出函数,甚至是类(react的模块基本都是输出类)

//index.js
import { say, type } from './content' 
let says = say()
console.log(`The ${type} says ${says}`) //The dog says Hello

这里输入的时候要注意:大括号里面的变量名,必须与被导入模块(content.js)对外接口的名称相同。

如果还希望输入content.js中输出的默认值(default), 可以写在大括号外面。

//index.js
import animal, { say, type } from './content' 
let says = say()
console.log(`The ${type} says ${says} to ${animal}`) 
//The dog says Hello to A cat

修改变量名

此时我们不喜欢type这个变量名,因为它有可能重名,所以我们需要修改一下它的变量名。在es6中可以用as实现一键换名。

//index.js
import animal, { say, type as animalType } from './content' 
let says = say()
console.log(`The ${animalType} says ${says} to ${animal}`) 
//The dog says Hello to A cat

模块的整体加载

除了指定加载某个输出值,还可以使用整体加载,即用星号(*)指定一个对象,所有输出值都加载在这个对象上面。

//index.js
import animal, * as content from './content' 
let says = content.say()
console.log(`The ${content.type} says ${says} to ${animal}`) 
//The dog says Hello to A cat

通常星号*结合as一起使用比较合适。

终极秘籍

考虑下面的场景:上面的content.js一共输出了三个变量(default, say, type),假如我们的实际项目当中只需要用到type这一个变量,其余两个我们暂时不需要。我们可以只输入一个变量:

import { type } from './content'

由于其他两个变量没有被使用,我们希望代码打包的时候也忽略它们,抛弃它们,这样在大项目中可以显著减少文件的体积。

ES6帮我们实现了!

不过,目前无论是webpack还是browserify都还不支持这一功能...

如果你现在就想实现这一功能的话,可以尝试使用rollup.js

他们把这个功能叫做Tree-shaking,哈哈哈,意思就是打包前让整个文档树抖一抖,把那些并未被依赖或使用的东西统统抖落下去。。。

看看他们官方的解释吧:

Normally if you require a module, you import the whole thing. ES2015 lets you just import the bits you need, without mucking around with custom builds. It's a revolution in how we use libraries in JavaScript, and it's happening right now.

未完待续

希望更全面了解es6伙伴们可以去看阮一峰所著的电子书ECMAScript 6入门

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
Webkit的跨域安全问题说明
Sep 13 Javascript
解决js下referer兼容各大浏览器的方法
Nov 03 Javascript
AngularJS入门教程之REST和定制服务详解
Aug 19 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
Sep 21 Javascript
微信小程序 教程之数据绑定
Oct 18 Javascript
JS 实现导航菜单中的二级下拉菜单的几种方式
Oct 31 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
Apr 04 jQuery
JavaScript数组push方法使用注意事项
Oct 30 Javascript
javascript判断一个变量是数组还是对象
Apr 10 Javascript
jQuery 淡入/淡出效果函数用法分析
May 19 jQuery
vue3.0搭配.net core实现文件上传组件
Oct 29 Javascript
javaScript Array api梳理
Mar 31 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
Apr 18 #Javascript
原生js实现拖拽功能基本思路详解
Apr 18 #Javascript
一个基于react的图片裁剪组件示例
Apr 18 #Javascript
JS实现对json对象排序并删除id相同项功能示例
Apr 18 #Javascript
Angular ng-animate和ng-cookies用法详解
Apr 18 #Javascript
JS实现的base64加密解密操作示例
Apr 18 #Javascript
JS实现简单获取最近7天和最近3天日期的方法
Apr 18 #Javascript
You might like
PHP中header和session_start前不能有输出原因分析
2013/01/11 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
php 伪静态之IIS篇
2014/06/02 PHP
thinkphp5.0自定义验证规则使用方法
2017/11/16 PHP
jquery实现图片随机排列的方法
2015/05/04 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
JavaScript原生编写《飞机大战坦克》游戏完整实例
2017/01/04 Javascript
json数据处理及数据绑定
2017/01/25 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
详解浏览器缓存和webpack缓存配置
2018/07/06 Javascript
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
微信小程序实现打卡日历功能
2020/09/21 Javascript
vue-router跳转时打开新页面的两种方法
2019/07/29 Javascript
vue项目查看vue版本及cli版本的实现方式
2020/10/24 Javascript
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
Python多层嵌套list的递归处理方法(推荐)
2016/06/08 Python
Pandas中把dataframe转成array的方法
2018/04/13 Python
详解Django rest_framework实现RESTful API
2018/05/24 Python
Python 实现「食行生鲜」签到领积分功能
2018/09/26 Python
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
Python实现TCP通信的示例代码
2019/09/09 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
python实现连续变量最优分箱详解--CART算法
2019/11/22 Python
Python实现计算图像RGB均值方式
2020/06/04 Python
python opencv把一张图片嵌入(叠加)到另一张图片上的实现代码
2020/06/11 Python
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
高中考试作弊检讨书
2014/01/14 职场文书
小学优秀班干部事迹材料
2014/05/25 职场文书
社区护士演讲稿
2014/08/27 职场文书
教师群众路线教育实践活动学习笔记
2014/11/05 职场文书
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技
深入讲解数据库中Decimal类型的使用以及实现方法
2022/02/15 MySQL