详解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 相关文章推荐
图片无缝滚动代码(向左/向下/向上)
Apr 10 Javascript
javascript 数组操作详解
Jan 29 Javascript
js鼠标点击图片实现随机变换图片的方法
Feb 16 Javascript
javascript跑马灯抽奖实例讲解
Apr 17 Javascript
原生js实现回复评论功能
Jan 18 Javascript
jQuery实现点击自身以外区域关闭弹出层功能完整示例【改进版】
Jul 31 jQuery
基于vue中keep-alive缓存问题的解决方法
Sep 21 Javascript
vue.js 实现a标签href里添加参数
Nov 12 Javascript
KnockoutJS数组比较算法实例详解
Nov 25 Javascript
vue组件系列之TagsInput详解
May 14 Javascript
在react-antd中弹出层form内容传递给父组件的操作
Oct 24 Javascript
一百多行代码实现react拖拽hooks
Mar 23 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 无限级缓存的类的扩展
2009/03/16 PHP
php分页函数示例代码分享
2014/02/24 PHP
zf框架的校验器使用使用示例(自定义校验器和校验器链)
2014/03/13 PHP
百度地图API应用之获取用户的具体位置
2014/06/10 PHP
浅谈php命令行用法
2015/02/04 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
JavaScript 判断浏览器类型及版本
2009/02/21 Javascript
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
jQuery前端框架easyui使用Dialog时bug处理
2014/12/05 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
让编辑器支持word复制黏贴、截屏的js代码
2016/10/17 Javascript
AngularJS实现DOM元素的显示与隐藏功能
2016/11/22 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
使用rst2pdf实现将sphinx生成PDF
2016/06/07 Python
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
Python yield 使用方法浅析
2017/05/20 Python
django框架如何集成celery进行开发
2017/05/24 Python
Python使用win32com实现的模拟浏览器功能示例
2017/07/13 Python
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
Python进阶之使用selenium爬取淘宝商品信息功能示例
2019/09/16 Python
Python爬虫之urllib基础用法教程
2019/10/12 Python
Django跨域请求原理及实现代码
2020/11/14 Python
英国儿童家具专卖店:GLTC
2016/09/24 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
新闻学专业应届生求职信
2013/11/08 职场文书
图书室管理制度
2014/01/19 职场文书
市政工程技术专业自荐书
2014/07/06 职场文书
总经理助理岗位职责
2015/01/31 职场文书
话题作文之财富(600字)
2019/12/03 职场文书
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
2021/04/05 MySQL
Anaconda配置各版本Pytorch的实现
2021/08/07 Python
MySQL去除密码登录告警的方法
2022/04/20 MySQL