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 相关文章推荐
页面只有一个text的时候,回车自动submit的解决方法
Aug 12 Javascript
jQuery点击后一组图片左右滑动的实现代码
Aug 16 Javascript
jquery获取焦点和失去焦点事件代码
Apr 21 Javascript
javascript中的正则表达式使用指南
Mar 01 Javascript
jquery实现很酷的网页顶部图标下拉菜单效果
Aug 22 Javascript
JS实现获取剪贴板内容的方法
Jun 21 Javascript
mpvue小程序仿qq左滑置顶删除组件
Aug 03 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
Dec 29 jQuery
Vue 组件参数校验与非props特性的方法
Feb 12 Javascript
使用vue开发移动端管理后台的注意事项
Mar 07 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
Apr 22 Javascript
Bootstrap FileInput实现图片上传功能
Jan 28 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
Codeigniter购物车类不能添加中文的解决方法
2014/11/29 PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
2016/02/14 PHP
一个简单的php路由类
2016/05/29 PHP
PHP精确计算功能示例
2016/11/29 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
2018/08/02 PHP
PHP单文件上传原理及上传函数的封装操作示例
2019/09/02 PHP
JavaScript 类似flash效果的立体图片浏览器
2010/02/08 Javascript
提高javascript效率 一次判断,而不要次次判断
2012/03/30 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
javascript函数自动执行常用方法汇总
2016/03/28 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
vue.js+element 默认提示中英文操作
2020/11/11 Javascript
[01:25]DOTA2自定义游戏灵园鬼域等你踏足
2015/10/30 DOTA
python中关于日期时间处理的问答集锦
2013/03/08 Python
Python进程间通信用法实例
2015/06/04 Python
django将图片上传数据库后在前端显式的方法
2018/05/25 Python
Python基础教程之if判断,while循环,循环嵌套
2019/04/25 Python
Python获取时间戳代码实例
2019/09/24 Python
python 字典的打印实现
2019/09/26 Python
Python timer定时器两种常用方法解析
2020/01/20 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
工厂厂长岗位职责
2013/11/08 职场文书
化妆师职业生涯规划书
2014/02/16 职场文书
珍爱生命演讲稿
2014/05/10 职场文书
大学生简短的自我评价
2014/09/12 职场文书
教师听课评语大全
2014/12/31 职场文书
2015年教师节活动总结
2015/03/20 职场文书
演讲开场白台词大全
2015/05/29 职场文书
MySQL 可扩展设计的基本原则
2021/05/14 MySQL
Debian11 Xfce终端光标的颜色怎么设置?
2022/08/14 数码科技