详解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 相关文章推荐
学习ExtJS form布局
Oct 08 Javascript
JQuery小知识
Oct 15 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
调试代码导致IE出错的避免方法
Apr 04 Javascript
div失去焦点事件实现思路
Apr 22 Javascript
AnjularJS中$scope和$rootScope的区别小结
Sep 18 Javascript
webpack学习笔记之优化缓存、合并、懒加载
Aug 24 Javascript
微信小程序异步API为Promise简化异步编程的操作方法
Aug 14 Javascript
angular多语言配置详解
May 16 Javascript
微信小程序云开发(数据库)详解
May 17 Javascript
Vue使用NProgress的操作过程解析
Oct 10 Javascript
Javascript实现秒表计时游戏
May 27 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在特殊字符前加斜杠的实现代码
2011/07/17 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
浅析PHP程序设计中的MVC编程思想
2014/07/28 PHP
php导出生成word的方法
2015/12/25 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
自制PHP框架之模型与数据库
2017/05/07 PHP
PHP Socket网络操作类定义与用法示例
2017/08/30 PHP
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
jQuery遍历对象、数组、集合实例
2014/11/08 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
jQuery增加自定义函数的方法
2015/07/18 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
js实现网页收藏功能
2015/12/17 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
vue实现按需加载组件及异步组件功能
2019/05/27 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
pytyon 带有重复的全排列
2013/08/13 Python
python实现根据窗口标题调用窗口的方法
2015/03/13 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
python数据结构之链表详解
2017/09/12 Python
python随机取list中的元素方法
2018/04/08 Python
Python使用Turtle库绘制一棵西兰花
2019/11/23 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
如何在Win10系统使用Python3连接Hive
2020/10/15 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
医院护士求职自荐信格式
2013/09/21 职场文书
安全教育实施方案
2014/03/02 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
2015年消费者权益日活动总结
2015/02/09 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
高中体育课教学反思
2016/02/16 职场文书