详解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实现用方向键控制层的上下左右移动
Jan 13 Javascript
js获取键盘按键响应事件(兼容各浏览器)
May 16 Javascript
简洁Ajax函数处理(示例代码)
Nov 15 Javascript
什么是cookie?js手动创建和存储cookie
May 27 Javascript
用JavaScript实现使用鼠标画线的示例代码
Aug 19 Javascript
js密码强度检测
Jan 07 Javascript
无法获取隐藏元素宽度和高度的解决方案
Mar 07 Javascript
Angular2监听页面大小变化的解决方法
Oct 09 Javascript
使用vue-cli(vue脚手架)快速搭建项目的方法
May 21 Javascript
vue 表单验证按钮事件交由父组件触发的方法
Dec 17 Javascript
JavaScript碰撞检测原理及其实现代码
Mar 12 Javascript
使用 Github Actions 自动部署 Angular 应用到 Github Pages的方法
Jul 20 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
帅气的琦玉老师
2020/03/02 日漫
星际争霸中的对战模式介绍
2020/03/04 星际争霸
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
实例讲解PHP中使用命名空间
2019/01/27 PHP
asp批量修改记录的代码
2008/06/25 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
关于onScroll事件在IE6下每次滚动触发三次bug说明
2011/09/21 Javascript
javascript计时器事件使用详解
2014/01/07 Javascript
JS替换文本域内的回车示例
2014/02/18 Javascript
JavaScript基础知识学习笔记
2014/12/02 Javascript
JavaScript设置body高度为浏览器高度的方法
2015/02/09 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
JavaScript中数组的各种操作的总结(必看篇)
2017/02/13 Javascript
基于JavaScript实现的插入排序算法分析
2017/04/14 Javascript
详解nodejs实现本地上传图片并预览功能(express4.0+)
2017/06/28 NodeJs
angularjs利用directive实现移动端自定义软键盘的示例
2017/09/20 Javascript
动态统计当前输入内容的字节、字符数的实例详解
2017/10/27 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
浅谈vue方法内的方法使用this的问题
2018/09/15 Javascript
Vuex的API文档说明详解
2020/02/05 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
基于vue实现简易打地鼠游戏
2020/08/21 Javascript
[47:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python实现多线程的方式及多条命令并发执行
2016/06/07 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
Python中常用信号signal类型实例
2018/01/25 Python
PyCharm下载和安装详细步骤
2019/12/17 Python
python3爬虫中异步协程的用法
2020/07/10 Python
用python读取xlsx文件
2020/12/17 Python
CSS3模块的目前的状况分析
2010/02/24 HTML / CSS
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
详解如何解决使用JSON.stringify时遇到的循环引用问题
2021/03/23 Javascript
态度决定一切演讲稿
2014/05/20 职场文书
民主评议党员总结
2014/10/20 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书