我正在一个php/codeigniter项目上工作,我正在考虑创建一个专门处理返回自定义css的控制器&javascript文件。
在以前的项目中,我包含了外部CSS &JS文件在我的视图文件的头,但他们基本上必须是静态的,因为他们只是作为常规资产发送的服务器。对于我的下一个项目,我正在考虑使用控制器,基本上使我的CSS/Javascript文件'视图'由控制器加载。
你们觉得怎么样?这是一个好方法吗?有没有一种被普遍接受的更好的方法?
通过在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->load->view()
有时动态js,但只有内联脚本标签(动态所见即所得配置为例)。这允许你将变量传递给"view"文件,并避免缓存问题。
我的观点是,仅仅为了提供应该是静态内容的而启动CI和所有相关依赖关系是不值得的。
我不知道是否有一个"官方"的方式这样做,我通常把一个页面分成不同的视图,其中一个是页头。如果你输入
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>
我以前做过的事情是,我有一个"总是使用"的css/js文件的标准列表,然后每个控制器可以包括自己的特定的。在控制器中,我为js/css设置了一个"includes"数组,然后头视图检查该数组并将其内爆。这样,所有需要的js/css文件都在head
标签中指定。
来自控制器的例子:
$data['includes']['js'] = array('<script type="text/javascript" src="' . base_url() . 'assets/js/script.js"></script>');
示例from view:
if(isset($includes['js'])) echo implode("'n", $includes['js']) . "'n";