【问题标题】:Is KnockoutJS "global safe"?KnockoutJS “全球安全”吗?
【发布时间】:2016-06-18 19:23:01
【问题描述】:

the KnockoutJS library 是否依赖于全局 ko 对象以外的任何全局状态?或者是否有时间从 javascript 环境的全局状态中添加/减去其他项目(即浏览器中的 window. 对象)

我问是因为我正在创建一个将部署到网站/CMS 环境中的软件。我希望该软件是独立的,而不是依赖外部 CDN 资源。我想在这个软件中使用 KnockoutJS,并确保我对 KnockoutJS 的使用不会与网站/CMS 环境正在使用的任何 KnockoutJS 实例冲突。我不想有条件地加载外部 KnockoutJS 资源,因为我想确保正在运行的 Knockout my 软件的版本是我认为的。

我对 jQuery 有类似的要求——我知道我通过修改 jQuery 库来导出不同的全局变量来实现这一点——即var myJquery=...。我想对 Knockout 的 ko 变量做同样的事情——但如果 KnockoutJS 依赖于全局状态,这将无法正常工作。

【问题讨论】:

  • 避免 jQuery 冲突的正确方法是使用为此目的提供的.noConflict() API。
  • @Pointy 感谢您的参与,但我不确定您是否理解我要解决的问题。网站 A 使用 jQuery 1.8。我的软件,一个非生产开发工具,需要使用jQuery 1.9。我可以使用上述技术包含一个稍微分叉的 jQuery。这确保网站仍然运行在它自己的 jQuery 1.8 上,并且我可以运行我的代码在 jQuery 1.9 上。这肯定不是标准用例,但它是商业扩展业务中常见的一种技术。
  • .noConflict() API 实际上旨在完全适应您所描述的内容。当 jQuery 初始化时,它会保存它为 $jQuery 找到的任何值。调用jQuery.noConflict(true) 会将这些全局符号返回到它们的原始值。你可以保留对 你的 jQuery 的引用,但是你喜欢。
  • @Pointy 不是,但我明白你为什么会这么说。 jQuery 文档可能会提到运行两个 jQuery,但它也包含“不推荐”的警告,并假设您可以完全控制哪个是第二个 jQuery。在上面的场景中尝试使用 noConflict 的问题是我无法控制何时引入 jQuery。是在网站的 jQuery 之前还是之后?分叉技术更安全、更可靠,并且为这个特定实例产生的支持请求要少得多。关于jQuery.noConflict(true) 的有用信息——谢谢!
  • 如果你的jQuery是第一个,那么你调用.noConflict(true),它没有效果。然后,您的代码使用 your 对 jQuery 的引用。如果外星 jQuery 是第一个,那么对 .noConflict() 的调用会恢复旧环境,而您再次只使用自己的引用。但是,您可以随心所欲,修改库显然可以正常工作。

标签: javascript jquery knockout.js


【解决方案1】:

KnockoutJS 库是否依赖于全局 ko 对象以外的任何全局状态?

几乎没有。除了将ko 导出到window 之外,我所知道的仅有的两点:

  1. 在一些地方,它会检查window.jQuery 的存在(最低版本),并使用该内置功能。
  2. 在某些地方(例如the component default loader),它会检查是否存在需要库并使用它们(以一种与库无关的方式)。

但是 KO 不会在任何地方修改window(除了添加ko),AFAIK。

我想在这个软件中使用 KnockoutJS,并确保我对 KnockoutJS 的使用不会与网站/CMS 环境正在使用的任何 KnockoutJS 实例发生冲突。

那完全是另一个问题。应用程序的多个部分都使用 KnockoutJS 却不知道彼此存在两个主要问题:

  1. 以可能发生冲突的方式共享 DOM。最简单的例子是 CMS 可能在 body 上运行 ko.applyBindings,因此任何想要使用不同版本的 KO 处理其 DOM 部分的插件都会遇到问题。在这里不可能给出一般性的建议,这一切都取决于上下文和具体情况。
  2. 正在加载两个不同版本的 Knockout。显然,如果您什么都不做,加载的第二个版本将覆盖window.ko。虽然应该有解决方法,但您可能需要深入了解KO's source code。基本上,您在最后一段中提到了这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 2013-02-03
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多