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 相关文章推荐
基于jQuery实现的水平和垂直居中的div窗口
Aug 08 Javascript
通过复制Table生成word和excel的javascript代码
Jan 20 Javascript
node.js中实现同步操作的3种实现方法
Dec 05 Javascript
深入理解JavaScript系列(39):设计模式之适配器模式详解
Mar 04 Javascript
Three.js学习之文字形状及自定义形状
Aug 01 Javascript
在Docker快速部署Node.js应用的详细步骤
Sep 02 Javascript
node.js路径处理方法以及绝对路径详解
Mar 04 Javascript
简单实现js进度条加载效果
Mar 25 Javascript
ajax请求+vue.js渲染+页面加载的示例
Feb 11 Javascript
发布订阅模式在vue中的实际运用实例详解
Jun 09 Javascript
Vue toFixed保留两位小数的3种方式
Oct 23 Javascript
手动实现vue2.0的双向数据绑定原理详解
Feb 06 Vue.js
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获取本地图片文件并生成xml文件输出具体思路
2013/04/27 PHP
php 问卷调查结果统计
2015/10/08 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
javascript学习笔记(八) js内置对象
2012/06/19 Javascript
jquery获取URL中参数解决中文乱码问题的两种方法
2013/12/18 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
js原型链与继承解析(初体验)
2016/05/09 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
[js高手之路]图解javascript的原型(prototype)对象,原型链实例
2017/08/28 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
详解解决Vue相同路由参数不同不会刷新的问题
2018/10/12 Javascript
微信小程序扫描二维码获取信息实例详解
2019/05/07 Javascript
python简单实现旋转图片的方法
2015/05/30 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
如何通过Python3和ssl实现加密通信功能
2020/05/09 Python
python爬虫利器之requests库的用法(超全面的爬取网页案例)
2020/12/17 Python
英国花园家具中心:Garden Furniture Centre
2017/08/24 全球购物
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
医学院学生求职简历的自我评价
2013/10/24 职场文书
2013年员工自我评价范文
2013/12/27 职场文书
写给老婆的检讨书
2014/02/21 职场文书
幼师求职自荐信
2014/05/31 职场文书
领导干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
孔庙导游词
2015/02/04 职场文书
2015年教师师德师风承诺书
2015/04/28 职场文书
《三国志》赏析
2019/08/27 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
Spring Bean的实例化之属性注入源码剖析过程
2021/06/13 Java/Android