如何让Ace不再寻找当前目录中的主题和模式?
我一直在研究一个使用Cloud9提供的Ace浏览器代码编辑器的MVC Web应用程序。 ace.js脚本和设置ace编辑器的脚本都在我的BundleConfig上的ScriptBundle中。 捆绑正在装载完美。 在我的本地服务器上,在web.config中将debug设置为true,脚本运行得非常好。 但是,在web.config中启动调试设置为false的实时服务器后,出现了几个错误。
在修复了一些小故障后,仍有两个错误,我似乎无法理解其中的原因。 这两个错误看起来非常相似,因为它们是Ace的chrome主题和Ace的HTML模式脚本都没有找到404错误。 在设置编辑器的脚本中,它们的调用方式如下:
editor.setTheme("ace/theme/chrome"); editor.getSession().setMode("ace/mode/html");
在我的本地计算机上,将调试设置为true,主题和模式设置得非常好,一切都按计划运行。 但是,正如我所说,在调试设置为false的实时服务器上,因此缩小了ScriptBundles中的所有脚本,我得到主题和模式的404错误。
当我在谷歌浏览器中启动JavaScript控制台时,我被告知有两个404错误。 有关404错误的有趣之处在于它们链接到我正在查看的页面的当前目录,然后分别是“theme-chrome.js”和“mode-html.js”。 他们从来没有在那个目录中,但仍然没有。
所以我的问题是为什么脚本在缩小后开始在当前目录中查找它们的文件? 我该怎么做才能解决这个问题,这样我才能让它们在捆绑中保持简化,让它们有效? 或者有办法吗?
提前感谢您的帮助。
我发现使用Ace和MVC Bundling和Minification,我需要使用绝对引用在ace配置中设置basePath。
ace.config.set("basePath", "/Scripts/FullPathToMy/AceEditorDirectory");
它可能不是最好的解决方案,但它应该让你顺利。
你缩小时Ace没有解析基本路径的原因是因为缩小版本是一个与这个模式不匹配的新唯一名称: ^(.*)\/ace(\-\w+)?\.js(\?|$)/
。 Ace使用该模式查找创建它的脚本元素,并使用src
属性确定路径。
@Paul的答案是最好的,但如果由于某种原因你无法这样做,Ace还会检查以data-ace-
开头的属性中的选项,这是任何脚本标记的一部分。
在System.Web.Optimization v 1.10中,您可以使用Scripts.RenderFormat(format, script)
呈现脚本标记以指定基本路径。
注意:在其他Stack Overflow答案中,他们说要使用Microsoft.AspNet.Web.Optimization ,但现在不再是这种情况了。 您可能必须使用nuget来更新您的版本。
MVC版本
@Scripts.RenderFormat(@"", "~/bundlepath")
Web窗体版本
<%: Scripts.RenderFormat(@"", "~/bundlepath") %>