【问题标题】:(Groovy/Grails) What to do about URLs in JavaScript module that need to change per environment (dev/prod/qa/etc)(Groovy/Grails)如何处理 JavaScript 模块中需要根据环境更改的 URL(dev/prod/qa/etc)
【发布时间】:2010-08-21 18:32:28
【问题描述】:

我以前曾对此进行过抨击,和/或对其进行过破解,但我想一劳永逸地解决它。

问题是如果我需要一个在作为 Groovy/Grails 项目的一部分的 JavaScript 模块中随环境变化的 URL 该怎么办

例如,我有一个包含这个函数的 JavaScript 模块:

function init() {
    dojox.cometd.init('http://localhost:8082/grails-cometd/cometd');   // This URL changes for prod vs dev 
    dojox.cometd.subscribe('/queue/advisoryLock', onMessage);
}

grails 链接标签等在这里不起作用。是否有适当的 Grails/Java 方式来执行此操作?我什么都找不到……

【问题讨论】:

    标签: javascript grails groovy


    【解决方案1】:

    由于 grails 支持配置设置,我会根据环境指定 URL,然后在您正在使用的 grails 布局上设置值。

    与上述相同,但利用 grails 为您提供的功能

    内部配置文件

    environments {
        development {
            env.root.url = 'http://localhost:8080/development'
        }  
        production {
            env.root.url = 'http://localhost:8080/production'
        }  
        staging {
            env.root.url = 'http://localhost:8080/staging'
        }  
    }
    

    在布局文件中

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <%@ page import="org.codehaus.groovy.grails.commons.ConfigurationHolder" %>
    <html>
    <head>
        <script type="text/javascript">
        my_project_webroot = "${ConfigurationHolder.config.env.root.url}";
        </script>
    

    ...现在嵌入您的 JavaScript 文件.....

    此外,根据您的 javascript 文件的结构,您可以直接嵌入 grails 配置值

    【讨论】:

    • 或者直接使用 ${grailsApplication.config.env.root.url} 而不是导入/访问类
    • 我更喜欢这种方式,它最干净。
    • 最好使用 grails.serverURL 设置,因为它是标准设置。简要记录在用户指南的第 3.1.1 节中。
    【解决方案2】:

    我既不了解 Java 也不了解 Grails,因此可能有一些我不知道的本地方式(这显然更可取。),但处理此问题的一种常见方式是在 HTML 中定义一个全局变量嵌入脚本之前的文档:

    <html>
    <head>
    
    <script type="text/javascript">
    my_project_webroot = "http://localhost:8082";
    </script>
    
    ... now embed your JavaScript files .....
    

    然后您可以在函数中寻址my_project_webroot

    function init() {
        dojox.cometd.init(my_project_webroot+'/grails-cometd/cometd');   // This URL changes for prod vs dev 
        dojox.cometd.subscribe('/queue/advisoryLock', onMessage);
    }
    

    如果您发现全局变量丑陋(确实如此),您还可以考虑为所有此类设置(网络根/静态网络根/当前语言...)设置一个全局 config 对象以减少混乱。

    此外,Dojo 框架可能会提供一些您可以扩展的配置对象。

    【讨论】:

    • 对于 Grails,这意味着 my_project_webroot = '';此行创建的 url 是 Config.groovy 中 grails.serverURL 中的 url。如果你不想要尾部斜杠,你可以省略 dir 属性。
    • 还可以从 window.location.href 初始化 my_project_webroot 变量,并在第一个或第二个斜杠之后删除所有内容,具体取决于您是否要保留上下文路径。唯一的问题是,如果您在服务器上部署为 ROOT,并在本地使用上下文路径运行,则必须以不同方式处理。
    【解决方案3】:

    还有一个 Grails JavaScript URL Mappings 插件,它将使客户端的一些 g.createLink 功能对 JavaScript 可用。如果您尝试将链接返回到您自己的服务器。

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-21
      • 1970-01-01
      相关资源
      最近更新 更多