【发布时间】:2017-10-13 07:54:05
【问题描述】:
有 ES6 应用程序,它与 webpack 和 babel 插件捆绑在一起。是否可以修改一些源代码,在每个对象中注入隐藏字段?
一些 babel/webpack 插件,包括 webpack-replace-plugin 和 babel-minify-replace,允许互操作字段访问和创建一些宏定义
但问题是包装所有对象创建,并插入一些具有唯一名称的字段。它应该无处不在 - 在对象创建文字中,在剩余传播副本中等等,所以用正则表达式替换天真不是解决方案。
原码:
const obj1 = { aaa:10, bbb:20 };
const obj2 = new Object();
const obj3 = { ...obj1, ddd: 20 };
const arr = [1, 2, 3];
const str = new String("ABC");
转换后的代码:
const obj1 = { aaa:10, bbb:20, SECRET_PROPERTY: true };
const obj2 = new Object(); obj2.SECRET_PROPERTY = true;
const obj3 = { ...obj1, ddd: 20, SECRET_PROPERTY: true };
const arr = [1, 2, 3]; arr.SECRET_PROPERTY = true;
const str = new String("ABC"); str.SECRET_PROPERTY = true;
当然,这样的操作会减少对原始代码的优化,仅在调试/开发模式下需要。
更新:找到了 babel 插件,它具有最接近原始任务的功能 - https://github.com/JonAbrams/elsa 。它执行不同的任务,但可以轻松适应原始任务
【问题讨论】:
-
当然,你可以编写自己的 babel 插件来做到这一点。
-
@FelixKling 当然!也许,为此目的的一些插件已经存在?或者有一些功能类似的插件,可以分叉并适应原始任务?
-
也许吧,但要求软件推荐是题外话。
-
如果某些代码具有迭代属性并在出现意外值时中断的逻辑怎么办?在随机对象上注入新属性似乎极有可能破坏东西。
-
@loganfsmyth 对于这个问题,它似乎可以是两个级别的解决方案。第一级可能涵盖大多数用例。它基于带有
enumerable: false选项的Object.defineProperty操作,因此默认Object.keys或for-of循环中不会显示该属性。另一种方法是使用Symbol属性。当然,秘钥可以通过Object.getOwnPropertyDescriptors检索,但它本身就是特定的用例。
标签: webpack ecmascript-6 babeljs