暴露代码的怪异写法 arguments [0].exports 应用一例

假设有个 api.js 模块,需要对外导出3个函数getSeller()、getGoods()和getRatings(),导出方法采用的是export {}写法如下

export {
    getSeller, getGoods, getRatings
}

在 App.vue 中,与此对应的调用代码如下

import { getSeller, getGoods, getRatings } from 'api'
getSeller()    //拿到模块方法后使用之
getGoods()
getRatings()

如果 api.js 模块是用 export default 方式导出的

export default {
    getSeller, getGoods, getRatings
}

那么在 App.vue 中,导入及调用代码就必须做修改(不能再用 import {..} 的写法)

import api from 'api' 
api.getSeller() //函数名之前要加入模块名称
api.getGoods()  
api.getRatings()

而今,我要达到一个目的:对于 api.js 模块,用户既可以使用 import {..} 进行导入,也可以使用 import api from ‘api’ 进行导入。为此,需要修改模块的导出方式,比如改成如下方式(两次导出法)

export {
    getSeller, getGoods, getRatings
}
export default {
    getSeller, getGoods, getRatings
}

如果函数很多(假设有几百个),那上面的写法将会变得臃肿。
为此,我找到了一个怪异的写法。代码如下

let exp={
    getSeller, getGoods, getRatings
}
exp.default= exp;
Object.assign(arguments[0].exports, exp)

其中的赋值语句exp.default= exp即可达到代码瘦身的目的,而Object.assign(arguments[0].exports, exp)正是此法的怪异之处。这条,很不容易想到。

如果不这么写会怎么样?比如尝试如下写法(可惜,都行不通的)

//* 以下7种尝试简化的写法都行不通
let exp={
    getSeller, getGoods, getRatings
}
exp.default= exp;
export exp;                          // Failed to compile
// export {exp};                        // BAD
// export {Object.assign({}, exp)};     // Failed to compile
// export Object.assign({}, exp);       // Failed to compile
// module.exports=exp;          // Error: Cannot assign to read only property 'exports'
// exports=exp;                 // Error: exports is not defined
// Object.assign(this, exp);    // Error: Cannot convert undefined or null to object
//*/

本项目下载链接 git@gitee.com:zhaiduting/vue-sell-cube.git 或者 gitee.com/zhaiduting/vue-sell-cube... (npm i 之后 npm run serve)。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
63
粉丝
17
喜欢
140
收藏
118
排名:132
访问:7.4 万
私信
所有博文
社区赞助商