详解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 相关文章推荐
IE8下关于querySelectorAll()的问题
May 13 Javascript
动态加载js和css(外部文件)
Apr 17 Javascript
angularjs实现与服务器交互分享
Jun 24 Javascript
JS输出空格的简单实现方法
Sep 08 Javascript
JavaScript 闭包机制详解及实例代码
Oct 10 Javascript
微信小程序  自定义创建详细介绍
Oct 27 Javascript
AngularJS入门示例之Hello World详解
Jan 04 Javascript
AngularJS select加载数据选中默认值的方法
Feb 28 Javascript
Vue v-text指令简单使用方法示例
Sep 19 Javascript
JS实现网站楼层导航效果代码实例
Jun 16 Javascript
Element Alert警告的具体使用方法
Jul 27 Javascript
基于javascript实现移动端轮播图效果
Dec 21 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实现把数字ID转字母ID
2013/08/12 PHP
将酷狗krc歌词解析并转换为lrc歌词php源码
2014/06/20 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
php快速排序原理与实现方法分析
2016/05/26 PHP
php动态读取数据清除最右边距的方法
2017/04/12 PHP
js转义字符介绍
2013/11/05 Javascript
js replace替换所有匹配的字符串
2014/02/13 Javascript
扩展jQuery对象时如何扩展成员变量具体怎么实现
2014/04/25 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
JS加载器如何动态加载外部js文件
2016/05/26 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
省市二级联动小案例讲解
2016/07/24 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
前端框架学习总结之Angular、React与Vue的比较详解
2017/03/14 Javascript
Bootstrap常用组件学习(整理)
2017/03/24 Javascript
vue2组件之select2调用的示例代码
2017/10/12 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
JavaScript对象原型链原理详解
2020/02/05 Javascript
[16:27]DOTA2 HEROS教学视频教你分分钟做大人-艾欧
2014/06/11 DOTA
Python爬虫模拟登录带验证码网站
2016/01/22 Python
简单学习Python time模块
2016/04/29 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
python3设计模式之简单工厂模式
2017/10/17 Python
python+opencv轮廓检测代码解析
2018/01/05 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
日本整理专家Marie Kondo的官方在线商店:KonMari
2020/06/29 全球购物
党章学习思想汇报
2014/01/14 职场文书
2015年教学工作总结
2015/04/02 职场文书
2015年幼儿园大班工作总结
2015/04/25 职场文书
夏洛特的网观后感
2015/06/15 职场文书