【问题标题】:Using a controller to handle returning customized css & javascript files with codeigniter使用控制器通过 codeigniter 处理返回的自定义 css 和 javascript 文件
【发布时间】:2011-07-07 15:49:23
【问题描述】:

我正在开发一个 php/codeigniter 项目,我正在考虑创建一个控制器来专门处理返回的自定义 css 和 javascript 文件。

在以前的项目中,我在视图文件的标题中包含了外部 CSS 和 JS 文件,但它们本质上必须是静态的,因为它们只是作为常规资产由服务器发送。对于我的下一个项目,我正在考虑使用控制器,并从本质上使我的 CSS/Javascript 文件成为控制器加载的“视图”。

你们怎么看?这是一个好方法吗?有没有普遍接受的更好的方法?

【问题讨论】:

    标签: php codeigniter view controller


    【解决方案1】:

    通过为您的 js/css 使用控制器,您需要为每个文件请求加载大量不必要的内容。安全类、输入类、路由器、异常等。

    应该是静态内容,您不需要这些。您也不希望文件是动态的(根据请求更改),因为这会影响浏览器缓存。文件要么在加载时被缓存,要么你将失去浏览器缓存的好处。

    最好的办法是合并文件,最小化它们,然后将内容写入静态文件,但它们不是动态的。但是,他们可能不应该这样做。

    您可以做的另一件事是使用 php 文件来组合静态文件并在 <link> 标记 (screen.php) 中引用它。简单的 CSS 示例:

    <?php
    header('Content-type: text/css');
    $files = array(
        'css/reset.css',
        'css/screen.css',
        'css/typography.css',
    );
    foreach ($files as $file)
    {
        readfile($file);
    }
    

    无论哪种方式,您都应该更新文件名,可能使用查询字符串,以避免提供旧的缓存文件。示例:/screen.css?version=2

    我有时将$this-&gt;load-&gt;view() 用于动态js,但仅用于内联脚本标签(例如动态所见即所得配置)。这允许您将变量传递给“视图”文件并避免缓存问题。

    我的观点是,仅仅为了提供应该是静态内容的内容而启动 CI 和所有相关依赖项是不值得的。

    【讨论】:

    • 关于额外开销的好点。我真的很想将它用于像javascript文件这样的情况,我想在页面加载时分配某个变量。但我不认为所有多余的开销都值得,而且我确实认为浏览器缓存我的文件会遇到很多问题。
    • 如果你只需要几个动态js变量,为什么不在你加载其他js之前将它们分配在&lt;head&gt;的内联&lt;script&gt;标签中?
    • 感谢您说服我 :)
    • 虽然比较重,和动态值无关,个人不太喜欢,大家不妨看看Carabiner
    • 感谢登山扣的提示。它如何缩小 javascript 和 css 文件然后缓存它们看起来很有趣。基于它缓存缩小的 javascript/css 的事实,我认为这将是一个性能提升器?你有什么理由认为在我的项目中使用这个库可能对我有害吗?
    【解决方案2】:

    我不知道是否有“官方”的方式来做到这一点,我通常将一个页面分成不同的视图,其中一个是页眉。 如果你做类似的事情

    class mycontroller extends CI_Controller {
    
    function index()
    {
       $data['css'] = 'style1.css';
       $data['js'] = 'custom.js';
       $this->load->view('head',$data);
       $this->load->view('body');
       $this->load->view('foot')  // where I close the </html> tag, for example
    }
    
    }
    

    您可以传递任何值,并且在您的视图中,只需加载控制器传递的内容

    <!DOCTYPE>
    <html>
    <head>
    <?php echo link_tag(base_url().'css/'.$css);?>
    <script type="text/css" src="<?php echo base_url();?>js/<?php echo $js;?>"></script>
    </head>
    

    【讨论】:

    • 我实际上已经在这样做了。我希望克服的问题是,您在标题中链接到的任何外部样式表或 javascript 文件都无法针对不同的场景(例如视图)进行自定义
    【解决方案3】:

    我之前做过的事情是我有一个标准的“经常使用”css/js 文件列表,然后每个控制器都可以包含它们自己的特定文件。在控制器中,我为 js/css 设置了一个“包含”数组,然后标题视图检查该数组并将其内爆。这样,所有需要的 js/css 文件都在 head 标签中指定。

    控制器示例:

    $data['includes']['js'] = array('<script type="text/javascript" src="' . base_url() . 'assets/js/script.js"></script>');
    

    视图示例:

    if(isset($includes['js'])) echo implode("\n", $includes['js']) . "\n";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-22
      相关资源
      最近更新 更多