详解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 相关文章推荐
脚本收藏iframe
Jul 21 Javascript
ASP.NET jQuery 实例16 通过控件CustomValidator验证RadioButtonList
Feb 03 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
Mar 07 Javascript
Extjs 4.x 得到form CheckBox 复选框的值
May 04 Javascript
JavaScript实现找出字符串中第一个不重复的字符
Sep 03 Javascript
node+express+jade制作简单网站指南
Nov 26 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
Dec 15 Javascript
JavaScript中String.prototype用法实例
May 20 Javascript
快速学习jQuery插件 Cookie插件使用方法
Dec 01 Javascript
基于javascript实现图片预加载
Jan 05 Javascript
简单实现js页面切换功能
Jan 10 Javascript
vue自定义js图片碎片轮播图切换效果的实现代码
Apr 28 Javascript
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
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
2008/11/14 PHP
PHP has encountered an Access Violation 错误的解决方法
2010/01/17 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
html a标签-超链接中confirm方法使用介绍
2013/01/04 Javascript
JS实现可改变列宽的table实例
2013/07/02 Javascript
一个简单的JS时间控件示例代码(JS时分秒时间控件)
2013/11/22 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
简单谈谈javascript Date类型
2015/09/06 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
基于jquery实现弹幕效果
2016/09/29 Javascript
javascript实现Java中的Map对象功能的实例详解
2017/08/21 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
微信公众号网页分享功能开发的示例代码
2020/05/27 Javascript
Python中列表元素转为数字的方法分析
2016/06/14 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
python读写csv文件实例代码
2019/07/05 Python
解决python tkinter界面卡死的问题
2019/07/17 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Pytorch 实现冻结指定卷积层的参数
2020/01/06 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
浅析python中的del用法
2020/09/02 Python
如何用python实现一个HTTP连接池
2021/01/14 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
纪伊国屋新加坡网上书店:Kinokuniya新加坡
2017/12/29 全球购物
汽车运用工程毕业生自荐信
2013/10/29 职场文书
实习生体会的自我评价范文
2013/11/28 职场文书
银行求职自荐信
2014/06/30 职场文书
锅炉工岗位职责
2015/02/13 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
三八节活动主持词
2015/07/04 职场文书
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python