详解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验证jsp页面属性是否为空(实例代码)
Nov 08 Javascript
父节点获取子节点的字符串示例代码
Feb 26 Javascript
js对象内部访问this修饰的成员函数示例
Apr 27 Javascript
JS中Location使用详解
May 12 Javascript
JavaScript获取中英文混合字符串长度的方法示例
Feb 04 Javascript
微信小程序 Nginx环境配置详细介绍
Feb 14 Javascript
VUE页面中加载外部HTML的示例代码
Sep 20 Javascript
javascript中的replace函数(带注释demo)
Jan 07 Javascript
详解ajax的data参数错误导致页面崩溃
Apr 30 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
Feb 26 Javascript
Javascript异步编程async实现过程详解
Apr 02 Javascript
如何使用jQuery操作Cookies方法解析
Sep 08 jQuery
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强制类型转换,慎用!
2013/06/06 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
2018/07/17 PHP
javascript parseInt 函数分析(转)
2009/03/21 Javascript
JS获取dom 对象 ajax操作 读写cookie函数
2009/11/18 Javascript
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
javascript 动态修改样式和层叠样式表代码
2010/04/27 Javascript
JavaScript对象和字串之间的转换实例探讨
2013/04/21 Javascript
左侧是表头的JS表格控件(自写,网上没有的)
2013/06/04 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
JS模拟键盘打字效果的方法
2015/08/05 Javascript
JS实现关闭当前页而不弹出提示框的方法
2016/06/22 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
jQuery使用$获取对象后检查该对象是否存在的实现方法
2016/09/04 Javascript
Select2.js下拉框使用小结
2016/10/24 Javascript
原生js实现放大镜效果
2017/01/11 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
Vue.js实现价格计算器功能
2020/03/30 Javascript
Vue利用路由钩子token过期后跳转到登录页的实例
2017/10/26 Javascript
vue2.0.js的多级联动选择器实现方法
2018/02/09 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
JS实现判断图片是否加载完成的方法分析
2018/07/31 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
Sublime开发python程序的示例代码
2018/01/24 Python
如何基于Python实现电子邮件的发送
2019/12/16 Python
IDLE下Python文件编辑和运行操作
2020/04/25 Python
AmazeUI 评论列表的实现示例
2020/08/13 HTML / CSS
网络信息管理员岗位职责
2014/01/05 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
2015毕业生实习期工作总结
2015/04/09 职场文书
心理健康教育主题班会
2015/08/13 职场文书
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js