详解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必备 api中英文对照的chm手册 下载
May 03 Javascript
IE6下通过a标签点击切换图片的问题
Nov 14 Javascript
AngularJS 面试题集锦
Sep 06 Javascript
基于Javascript倒计时效果
Dec 22 Javascript
微信小程序 侧滑删除(左滑删除)
May 23 Javascript
详解使用angularjs的ng-options时如何设置默认值(初始值)
Jul 18 Javascript
vue-cli webpack配置文件分析
May 20 Javascript
在Layui中实现开关按钮的效果实例
Sep 29 Javascript
JS XMLHttpRequest原理与使用方法深入详解
Apr 30 Javascript
vue打包静态资源后显示空白及static文件路径报错的解决
Sep 02 Javascript
React + Threejs + Swiper 实现全景图效果的完整代码
Jun 28 Javascript
如何vue使用el-table遍历循环表头和表体数据
Apr 26 Vue.js
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.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
PHP接收App端发送文件流的方法
2016/09/23 PHP
php结合ajax实现手机发红包的案例
2016/10/13 PHP
CI框架AR数据库操作常用函数总结
2016/11/21 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
php的无刷新操作实现方法分析
2020/02/28 PHP
select组合框option的捕捉实例代码
2008/09/30 Javascript
基于编写jQuery的无缝滚动插件
2014/08/02 Javascript
javascript中局部变量和全局变量的区别详解
2015/02/27 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
vue组件与复用详解
2018/04/08 Javascript
Vue iview-admin框架二级菜单改为三级菜单的方法
2018/07/03 Javascript
Vue 与 Vuex 的第一次接触遇到的坑
2018/08/16 Javascript
vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component
2019/04/30 Javascript
es6函数之严格模式用法实例分析
2020/03/17 Javascript
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
python获取豆瓣电影简介代码分享
2014/01/16 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
python操作列表的函数使用代码详解
2017/12/28 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
Python自动抢红包教程详解
2019/06/11 Python
python如何求圆的面积
2020/07/01 Python
网络安全方面的面试题
2016/01/07 面试题
养殖行业的创业计划书
2014/01/05 职场文书
效能风暴心得体会
2014/09/04 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
2014最新股权信托合同协议书
2014/11/18 职场文书
2015年个人工作总结报告
2015/04/25 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
Java Kafka 消费积压监控的示例代码
2021/07/01 Java/Android
Java 数据结构七大排序使用分析
2022/04/02 Java/Android
SQL Server Agent 服务无法启动
2022/04/20 SQL Server