详解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 相关文章推荐
js 剪切板应用clipboardData详细解析
Dec 17 Javascript
node.js中watch机制详解
Nov 17 Javascript
javascript实现根据身份证号读取相关信息
Dec 17 Javascript
JavaScript编程中的Promise使用大全
Jul 28 Javascript
JavaScript Ajax编程 应用篇
Jul 02 Javascript
SpringMVC+bootstrap table实例详解
Jun 02 Javascript
详解基于 Nuxt 的 Vue.js 服务端渲染实践
Oct 24 Javascript
vue项目中使用tinymce编辑器的步骤详解
Sep 11 Javascript
Javascript地址引用代码实例解析
Feb 25 Javascript
vue 动态组件用法示例小结
Mar 06 Javascript
vue实现购物车加减
May 30 Javascript
用JS创建一个录屏功能
Nov 11 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实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
php中foreach结合curl实现多线程的方法分析
2016/09/22 PHP
php实现不通过扩展名准确判断文件类型的方法【finfo_file方法与二进制流】
2017/04/18 PHP
有关PHP 中 config.m4 的探索
2020/08/26 PHP
PHP7 windows支持
2021/03/09 PHP
js资料toString 方法
2007/03/13 Javascript
ajax 文件上传应用简单实现
2009/03/03 Javascript
关于Mozilla浏览器不支持innerText的解决办法
2011/01/01 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
2015/11/10 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
2017/09/14 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
Vue微信项目按需授权登录策略实践思路详解
2018/05/07 Javascript
基于vue实现可搜索下拉框定制组件
2020/03/26 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
python实现的希尔排序算法实例
2015/07/01 Python
Python实现的爬取豆瓣电影信息功能案例
2019/09/15 Python
Keras 使用 Lambda层详解
2020/06/10 Python
python求解汉诺塔游戏
2020/07/09 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
干部下基层实施方案
2014/03/14 职场文书
企业法人授权委托书范本
2014/09/23 职场文书
酒店前台岗位职责
2015/04/16 职场文书
酒店宣传语大全
2015/07/13 职场文书
2016年大学生暑期社会实践方案
2015/11/26 职场文书
阿里云Nginx配置https实现域名访问项目(图文教程)
2021/03/31 Servers
JS创建或填充任意长度数组的小技巧汇总
2021/10/24 Javascript