详解ES6 export default 和 import语句中的解构赋值


Posted in Javascript onMay 28, 2019

解构赋值

有如下 config 对象

const config = {
 host: 'localhost',
 port: 80
}

要获取其中的 host 属性

let { host } = config

拆分成模块

以上两段代码,放到同一个文件当中不会有什么问题,但在一个项目中,config 对象多处会用到,现在把 config 对象放到 config.js 文件当中。

// config.js
export default {
 host: 'localhost',
 port: 80
}

在 app.js 中 import config.js

// app.js
import config from './config'

let { host } = config
console.log(host) // => localhost
console.log(config.host) // => localhost

上面这段代码也不会有问题。但在 import 语句当中解构赋值呢?

// app.js
import { host } from './config'

console.log(host) // => undefined

问题所在

import { host } from './config'

这句代码,语法上是没什么问题的,之前用 antd-init 创建的项目,在项目中使用下面的代码是没问题的。奇怪的是我在之后用 vue-cli 和 create-react-app 创建的项目中使用下面的代码都不能正确获取到 host。

// config.js
export default {
 host: 'localhost',
 port: 80
}

// app.js
import { host } from './config'
console.log(host) // => undefined

babel 对 export default 的处理

我用 Google 搜 'es6 import 解构失败',找到了下面的这篇文章:ES6的模块导入与变量解构的注意事项。原来经过 webpack 和 babel 的转换

在ES6中变量解构是这样的:

const a = { b: 1 }
const { b } = a

我们可以直接用解构赋值来获得对象的同名属性,等效于:

const b = a.b

除了变量的解构赋值,ES6的模块导入也提供了相似的语法:

import { resolve } from 'path'

如果使用webpack构建项目的话,注意这里的解构与普通变量的解构是有所区别的,比如在a.js里有以下代码:

export default {

 b: 1

}

如果按照普通变量的解构法则来导入这个包,即这种形式:

import { b } from './a'

是会发生错误的,并不能导出变量b。主要因为这和webpack的构建有关。使用模块导入时,当用webpack构建后,以上的

import { b } from './a'

变为了类似

a.default.b

可以看到变量b在a.default上,并不在a上,所以解构出来是undefined。如果要正确解构,则必须在模块内导出,即:

export const b = 1

这样的话,构建后的代码中,变量b即在a上,而不是在a.default上,从而能正确解构。

所以

export default {
 host: 'localhost',
 port: 80
}

变成了

module.exports.default = {
 host: 'localhost',
 port: 80
}

所以取不到 host 的值是正常的。那为什么 antd-init 建立的项目有可以获取到呢?

解决

再次 Google,搜到了GitHub上的讨论 。import 语句中的"解构赋值"并不是解构赋值,而是 named imports,语法上和解构赋值很像,但还是有所差别,比如下面的例子。

import { host as hostName } from './config' // 解构赋值中不能用 as

let obj = {
 a: {
 b: 'hello',
 }
}

let {a: {b}} = obj // import 语句中不能这样子写
console.log(b) // => helllo

这种写法本来是不正确的,但 babel 6之前可以允许这样子的写法,babel 6之后就不能了。

// a.js
import { foo, bar } from "./b"
// b.js
export default {
 foo: "foo",
 bar: "bar"
}

所以还是在import 语句中多加一行

import b from './b'
let { foo, bar } = b

或者

// a.js
import { foo, bar } from "./b"
// b.js
let foo = "foo"
let bar = "bar"
export { foo, bar }

或者

// a.js
import { foo, bar } from "./b"
// b.js
export let foo = "foo"
export let bar = "bar"

而 antd-init 使用了babel-plugin-add-module-exports,所以 export default 也没问题。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 引发两次$(document.ready)事件
Jan 15 Javascript
jquery模拟按下回车实现代码
Sep 20 Javascript
判断客户浏览器是否支持cookie的示例代码
Dec 23 Javascript
Jquery Uploadify上传带进度条的简单实例
Feb 12 Javascript
jquery根据锚点offset值实现动画切换
Sep 11 Javascript
javascript中call apply 的应用场景
Apr 16 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
Jun 14 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
Sep 24 Javascript
基于webpack4搭建的react项目框架的方法
Jun 30 Javascript
vue下history模式刷新后404错误解决方法
Aug 18 Javascript
vue项目中使用多选框的实例代码
Jul 22 Javascript
如何让vue长列表快速加载
Mar 29 Vue.js
jQuery实现高级检索功能
May 28 #jQuery
利用原生JS实现data方法示例代码
May 28 #Javascript
php结合js实现多条件组合查询
May 28 #Javascript
vue实现前台列表数据过滤搜索、分页效果
May 28 #Javascript
js 将线性数据转为树形的示例代码
May 28 #Javascript
React中使用外部样式的3种方式(小结)
May 28 #Javascript
vue实现多条件和模糊搜索功能
May 28 #Javascript
You might like
Zend引擎的发展 [15]
2006/10/09 PHP
用 PHP5 轻松解析 XML
2006/12/04 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
用js小类库获取浏览器的高度和宽度信息
2012/01/15 Javascript
js网页版计算器的简单实现
2013/07/02 Javascript
jquery $("#variable") 循环改变variable的值示例
2014/02/23 Javascript
jQuery学习笔记之jQuery原型属性和方法
2014/06/09 Javascript
jquery动态添加删除(tr/td)
2015/02/09 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
整理AngularJS中的一些常用指令
2015/06/16 Javascript
基于jquery插件实现拖拽删除图片功能
2020/08/27 Javascript
JS弹性运动实现方法分析
2016/12/15 Javascript
Bootstrap源码解读模态弹出框(11)
2016/12/28 Javascript
老生常谈combobox和combotree模糊查询
2017/04/17 Javascript
webpack学习笔记之代码分割和按需加载的实例详解
2017/07/20 Javascript
Node.js服务器开启Gzip压缩教程
2017/08/11 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
浅谈JavaScript_DOM学习篇_图片切换小案例
2019/03/19 Javascript
解决vue项目中某一页面不想引用公共组件app.vue的问题
2020/08/14 Javascript
[01:59]深扒TI7聊天轮盘语音出处 1
2017/05/11 DOTA
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
python requests 使用快速入门
2017/08/31 Python
Python提取特定时间段内数据的方法实例
2019/04/01 Python
Python序列化pickle模块使用详解
2020/03/05 Python
基于Python实现视频的人脸融合功能
2020/06/12 Python
Python调用shell cmd方法代码示例解析
2020/06/18 Python
护理专业个人求职简历的自我评价
2013/10/13 职场文书
自考毕业自我鉴定
2014/03/18 职场文书
教师竞聘上岗演讲稿
2014/09/03 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
党员公开承诺书2015
2015/01/21 职场文书
行政介绍信范文
2015/05/04 职场文书
SQL Server连接查询的实用教程
2021/04/07 SQL Server
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android