详解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 相关文章推荐
ext读取两种结构的xml的代码
Nov 05 Javascript
离开页面时检测表单元素是否被修改,提示保存的js代码
Aug 25 Javascript
用js实现table单元格高宽调整,兼容合并单元格(兼容IE6、7、8、FF)实例
Jun 25 Javascript
JavaScript数组函数unshift、shift、pop、push使用实例
Aug 27 Javascript
js定义类的几种方法(推荐)
Jun 08 Javascript
jQuery简单实现tab选项卡切换效果
Jun 20 Javascript
浅谈js函数中的实例对象、类对象、局部变量(局部函数)
Nov 20 Javascript
vue2.0获取自定义属性的值
Mar 28 Javascript
Easyui和zTree两种方式分别实现树形下拉框
Aug 04 Javascript
JavaScript EventEmitter 背后的秘密 完整版
Mar 29 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
Aug 27 Javascript
详解VUE项目中安装和使用vant组件
Apr 28 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生成静态页
2006/11/25 PHP
eAccelerator的安装与使用详解
2013/06/13 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
JS中捕获console.log()输出的方法
2015/04/16 Javascript
基于javascript实现最简单的选项卡切换效果
2016/05/16 Javascript
Jquery表单验证失败后不提交的解决方法
2016/10/18 Javascript
js判断手机系统是android还是ios
2017/03/07 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
Vue3.x源码调试的实现方法
2019/10/13 Javascript
vue 导航锚点_点击平滑滚动,导航栏对应变化详解
2020/08/10 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
jquery插件懒加载的示例
2020/10/24 jQuery
Python中每次处理一个字符的5种方法
2015/05/21 Python
python函数的5种参数详解
2017/02/24 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
使用pyqt5 tablewidget 单元格设置正则表达式
2019/12/13 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
python读写文件write和flush的实现方式
2020/02/21 Python
五种Python转义表示法
2020/11/27 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
全球烹饪课程的领先预订平台:Cookly
2020/01/28 全球购物
4s店总经理岗位职责
2013/12/31 职场文书
房屋改造计划书
2014/01/10 职场文书
学生会干部自荐信
2014/02/04 职场文书
分层教学实施方案
2014/03/19 职场文书
艺术节开幕词
2015/01/28 职场文书
埃及王子观后感
2015/06/16 职场文书
青涩记忆观后感
2015/06/18 职场文书
为什么中国式养孩子很累?
2019/08/07 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书