动态创建和加载JS

时间:2014-02-16 12:11:10

标签: javascript php jquery dynamic

我正在开发一个PHP项目,它编写js文件并在页面加载时执行它们。

动态编写JS文件并将脚本标记附加到页面html并仅在每个页面请求中执行它是一个好习惯吗?

这是我的工作创建和链接JS文件:

<?php

if (!function_exists('setScript')) {
    function setScript($script = null)
    {
        static $_script = array();
        if ($script == null) {
            return $_script;
            $_script = array();
        } else {
            $_script[] = $script;
        }
    }
}

if (!function_exists('linkJs')) {
    function linkJs($controllerName, $actionName)
    {
        $jsFileName = randomString(40) . '.js';
        $folderName = PUBLIC_DIR . DS . 'generated';
        if (!is_dir($folderName)) {
            mkdir($folderName);
            chmod($folderName, 777);
        }
        $fileName = $folderName . DS . $jsFileName;
        $availableFiles = scandir($folderName);
        unset($availableFiles[0]);
        unset($availableFiles[1]);
        foreach ($availableFiles as $file) {
            $file = $folderName . DS . $file;
            if (is_file($file)) unlink($file);
        }
        $script = "$(document).ready(function() {\n" . implode("\n", setScript()) . "});";
        file_put_contents($fileName, $script);
        $url = loadClass('Url', 'helpers');
        return "<script type='text/javascript' src='" . $url->baseUrl() . 'public/generated/' . $jsFileName . "'></script>";
    }
}

if (!function_exists('alert')) {
    function alert($message, $returnScript = false)
    {
        if (isAjax()) {
            if ($returnScript) {
                return "\nalert('$message');\n";
            }
            echo "\nalert('$message');\n";
        } else {
            setScript("\nalert('$message');\n");
        }
    }
}

请建议这样做是否是一种良好的做法,或者我可以采用其他任何方式。

大约30-40个用户将同时登录到该网站,并且每秒将有大约5-10个页面请求。 (这些是预测。可能会走高)。

正在编写js文件(到硬盘驱动器)并链接它是一个很好的做法,或者只是将原始脚本添加到html主体是一个很好的做法,因为写入js文件会使js成为非侵入式。

此外,生成的javascript将是动态的,可能是针对每个页面请求。

1 个答案:

答案 0 :(得分:3)

如果除了每次动态生成之外别无其他选择(我的猜测是脚本的内容对于每个请求至少有80%的不同),那么将脚本直接写入html文件,因为链接会导致浏览器另外请求包含脚本。

您已经通过动态生成文件来降低性能。

我能想到的最好的方法是实际创建一个php脚本,自己生成js,然后创建一个.htaccess重写规则,将/script/generator/{HASH_FOR_REQUEST}.js重写为/path/to/php-script-generator.php,这样如果请求相同,您可以利用浏览器缓存。

但是,如果只是关于JS的具体细节发生变化并且js函数体仍然非常相似(即,您使用js将信息报告回客户端),那么考虑将js写入php文件中然后使用php内联标签回显你需要改变的东西。

例如:

此脚本会向js写一个警告,然后在加载查询字符串时,它会报告查询中的内容......

<?php
    // disable output buffering 

    /* the reason for this is that the browser will wait 
     * for the first byte returned before continuing with the page. 
     * If it has to wait for the whole file performance will be degarded.
     */

    while(ob_get_level() != 0) ob_end_clean();    

    header("Content-type:text/javascript");

    // it is wise to set some cache headers here


    if(isset($_GET['message']) {
        $message = urldecode($_GET['message']);
    } else {
        $message = "No message!";
    }
?>

// write the js...
alert("<?php echo $message; ?>");

通过请求/path/to/script.php?message=hello+world,脚本将返回alert("hello world");