当前位置: 首页 > 面试题库 >

如何阻止babel将“ this”转换为“ undefined”(并插入“ use strict”)

邢昂然
2023-03-14
问题内容

编辑 :这 与肥箭无关 。这也是不是通过 一个 IIFE 。这是与翻译员有关的问题。

因此,我为正在使用的小应用程序创建了一个简单的pub-
sub。我在ES6中编写了它,以使用传播/休息并节省一些麻烦。我用npm和gulp对其进行了设置以进行翻译,但它使我发疯。

我做了一个浏览器库,但意识到它可以在任何地方使用,所以我决定使其与Commonjs和AMD兼容。

这是我的代码的精简版:

(function(root, factory) {
 if(typeof define === 'function' && define.amd) {
    define([], function() {
        return (root.simplePubSub = factory())
    });
  } else if(typeof module === 'object' && module.exports) {
    module.exports = (root.simplePubSub = factory())
  } else {
    root.simplePubSub = root.SPS = factory()
  }
}(this, function() {
 // return SimplePubSub
});

但是,不管我什么(如使 这个 变量和传递),将其设置到 未定义

}(undefined, function() {

这可能与Babel 有所关联,Babel不知道 将是什么并将其转译出来,但是我可以采取其他方法吗?

更新 :传递}((window || module || {}), function() {而不是
似乎可行。我不确定这是否是最好的方法


问题答案:

对于Babel> = 7.x

ES6代码有两种处理方式:

  • “脚本”-通过<script>或任何其他标准ES5加载文件的方式加载文件时
  • “模块”-将文件作为ES6模块处理时

在Babel7.x中,默认情况下将文件解析为“模块”。引起您麻烦的是,在ES6模块中,thisundefined,而在这种"script"情况下,这取决于环境,例如window在浏览器脚本或exportsCommonJS代码中。同样,"module"文件是自动严格的,因此Babel将插入"usestrict";

在Babel7中,如果要避免这种行为,您需要告诉Babel文件的类型。最简单的选项是使用该"sourceType"选项sourceType: "unambiguous"在您的Babel 选项中进行设置,这实际上是告诉Babel基于importandexport语句的存在来猜测类型(脚本与模块)。主要的缺点是,在技术上可以使用不使用import或的ES6模块export,而这些模块会被错误地视为脚本。另一方面,这实际上并不常见。

另外,您可以使用Babel7的"overrides"选项将特定文件设置为脚本,例如

overrides: [{
  test: "./vendor/something.umd.js",
  sourceType: "script",
}],

两种方法都可以使Babel知道某些文件是script类型,因此不应该将其this转换为undefined

对于Babel <7.x

ES6代码有两种处理方式:

  • “脚本”-通过<script>或任何其他标准ES5加载文件的方式加载文件时
  • “模块”-将文件作为ES6模块处理时

当使用Babel 6和babel-preset-es2015(或Babel
5)时,Babel默认情况下假定其处理的文件是ES6模块。也就是造成你麻烦的事情是,一个ES6模块中,thisundefined和文件都是严格的,而在“脚本”的情况下,this取决于环境,比如window在浏览器脚本或exports在CommonJS的代码。

如果您使用的是Babel,最简单的选择是在不使用UMD包装器的情况下编写代码,然后使用Browserify之类的文件捆绑文件以自动为您添加UMD包装器。Babel还提供了一个babel- plugin-transform-es2015-modules-umd。两者都旨在简化,因此,如果您想要定制的UMD方法,则可能不适合您。

或者,您需要在babel-preset-es2015中显式列出所有Babel插件,并确保排除模块处理babel-plugin-transform-es2015-modules-commonjs插件。注意,这也将停止自动添加,usestrict因为这也是ES6规范的一部分,您可能需要添加回去babel-plugin-transform-strict-mode以自动严格执行代码。

babel-core@6.13预设开始就可以选择选项,因此您也可以

{
  "presets": [
    [ "es2015", { "modules": false } ]
  ]
}

在您的Babel配置(.babelrc)中使用,babel-preset-es2015以禁用模块处理。



 类似资料:
  • 问题内容: 我想播放现在以JSON格式保存的数据。但是我对R非常陌生,对如何处理数据一无所知。您可以在下面看到我设法实现的目标。但首先,我的代码: 我能够得到数据: 尽管输出看起来很原始: 请注意,JSON有点嵌套。我可以使用Python创建表,但是R似乎要复杂得多。 编辑: 我的JSON: 问题答案: 返回一个列表,您可以使用函数来遍历每个元素。将其转换为“表”非常简单(一旦您知道该怎么做!)(

  • 问题内容: 是否有可能做出无法逃脱和?我目前得到: 但我正在寻找这样的事情: 问题答案: 从Go 1.7开始,您仍然 无法使用json.Marshal()做到​​这一点 。json.Marshal的源代码显示: json.Marshal总是这样做的原因是: 字符串值编码为强制转换为有效UTF-8的JSON字符串,用Unicode替换符文替换无效字节。尖括号“ <”和“>”转义为“ \ u003c”

  • 问题内容: 我一直在使用转换和过渡来创建没有Javascript的动画UI组件,并真正享受结果,但是我遇到了一个令人困扰的问题,它似乎是Webkit浏览器所特有的。 在我旋转过的元素上,只能在元素右侧50%上访问跨越元素宽度100%的锚。 在Firefox中使用-moz-transform不存在此问题,但是在使用-webkit- transform的Chrome和Safari中均可以100%再现此

  • 问题内容: 我正在开发一些应用程序,它允许从SD卡中选择图像,将其保存到数据库中并为ImageView设置此值。我需要知道将uri转换为字符串并将字符串转换为uri的方法。现在,我使用了Uri的getEncodedPath()方法,但是例如,此代码不起作用: 因此,我不知道如何将Uri保存到数据库中并根据保存的值创建新的Uri。请帮我修复它。 问题答案: 我需要知道将uri转换为字符串并将字符串转

  • 我有两个集合设置,一个为个人用户,一个为用户可以加入的组。在单个集合中,用户有一个名为plastics的int数据,但当我尝试将该int数据分组显示时,它会在FireStore中转换为字符串。这是不好的,因为我需要这些数据保持int值,因为用户有能力添加到它,因此当它变成字符串时,用户不能再只为他们的单个集合更新组集合中的值。 这里有一张个人用户收藏的照片: 如您所见,名为plastics的int

  • 我想使用IntelliJ的特性,它通过简单地从Java文件复制粘贴到Kotlin文件来将Java代码转换为Kotlin。它工作得很好,但当我打开IdeaVim插件时,它就不再工作了。我很了解Vim,这不是我误解Vim编辑模式的问题。我知道如何将一部分Java源文件转换为Kotlin?并用@yole回答说没有其他工具可以做到这一点。 但这个答案是在三个月前做出的,也许出现了其他的工具。所以,我的问题