为大型项目表示 CSS 和 JS 文件的最佳方式

Posted

技术标签:

【中文标题】为大型项目表示 CSS 和 JS 文件的最佳方式【英文标题】:Best way to represent CSS & JS files for a big project 【发布时间】:2012-02-07 04:56:03 【问题描述】:

为大型项目表示 CSS 文件的最佳方式是什么

我正在使用 CodeIgniter,会有 100 个视图,并且几乎其中的视图具有不同的结构,所以我在这里有很多选择,但我不知道什么是最好的,所以请帮忙

    为CSS制作单个文件,为JS制作单个文件 为每个视图创建一个 CSS 文件,为每个视图创建一个 JS 制作一个简单的数据库表来保存相关文件 每种方法

例如

id ----- method_name ---- files (I will normalize it )
1        /test/first      first.css,first.js
and so on 

或使 php 函数从 PHP 获取关联文件作为文本

例如

<?php
function get_assoc($view)

      switch($view):
          case '/test/first':
             echo "<script>alert(); </script><style>pfont-weight:bold;</style>"; 
          break; 
      endswitch; 

?>

还有缓存呢?性能是一个很大的因素。 谢谢。

【问题讨论】:

【参考方案1】:

我喜欢将每个部分的重置/排版/表格/表格分开,这样我就不会迷路。不要害怕根据需要使用尽可能多的不同文件(用于开发目的)。

一旦您准备好进入生产/实时模式,从“html5boilerplate”中获取“构建工具”并将所有 css 压缩到一个文件中,对于 js 也是如此。这也将缩小您的代码并缓存您的文件。只需将未压缩的文件放在手边,以防您需要进行重大编辑

<!-- CSS -->
<link rel=stylesheet href="assets/css/reset.css" >
<link rel=stylesheet href="assets/css/typography.css" >
<link rel=stylesheet href="assets/css/tools.css" >
<link rel=stylesheet href="assets/css/tables.css" >
<link rel=stylesheet href="assets/css/forms.css" >
<link rel=stylesheet href="assets/css/plugins.css" >


<!-- Script -->
<script src="assets/js/modernizr2.0.js"></script>
<script src=https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js></script>
<script src="assets/js/plugins.js"></script>
<script src="assets/js/tools.js"></script>
<script src="assets/js/tables.js"></script>
<script src="assets/js/forms.js"></script>
<script src="assets/js/functions.js"></script>

然后我喜欢将每个 (js) 文件包装为一个对象,这同样有助于提高可读性。

示例:

(function($)

var ToolsObj = 

    init : function()

        this.tooltip();
        this.tabs();
        this.pagination();
        this.alerts();
        this.dropdowns();
        this.lightbox();

    ,
    tooltip : function()

        //tooltip code
    ,
    tabs : function()

        //tabs code
    ,
    pagination : function()

    ,
    alerts : function()

        //alert messages code
    ,
    dropdowns : function()

        //dropdown-menu code
    ,
    lightbox : function()

        //lightbox code

    





$(function()

    ToolsObj.init();
);

 )(jQuery.noConflict());

希望这能让您对我的工作流程有所了解。 您可能还想在运行对象之前检查文档中是否存在每个元素。

【讨论】:

这很好,但是如何制作一个脚本来只编写所需的代码(CSS 和 JS)然后将其包含在内? 只需检查文档中是否存在该元素->> if(document.getElementById(element_id))run code,否则创建一个functions.js并将所有调用内联。即:onclick/onChange 等 即: 嗯,这是个好主意,我会检查一下,非常感谢【参考方案2】:

数据库 = 否

不要为此使用数据库。显示视图所需的 CSS/JS 文件直接与源代码相关联,因此请将该信息保留在源代码中(特别是如果您使用的是 Git 或 SVN 等 SCM)。

CSS/JS = 演示文稿

由于这些文件与演示文稿/UI 相关,我建议将加载它们的“责任”委托给视图本身。控制器和模型不必“了解”任何有关显示视图所需的 CSS/JS 的信息。

模块化

将文件组织成离散的模块化单元。不要为每个视图都有一个单独的 CSS/JS 文件,除非你真的在每个视图上都有完全独立的功能。您在视图之间共享这些文件的次数越多,您的情况就会越好。

利用缓存,而不是与之抗衡

我知道每次修改文件时都重命名文件很麻烦,但这确实是一个好方法。使用缓存失效方法(如 URL?time=...)只会毫无理由地给服务器和客户端带来额外的压力。只需花两秒钟将“styles.css”文件重命名为“styles_v2.css”。以后你会感谢自己的。 (请记住,您不必为每次开发更改都重命名它——只有当它足够稳定以用于 QA/生产时)。

过早的优化 = 万恶之源

最后——也是最重要的——永远不要过早地优化!我见过太多的人一直在缩小和压缩他们的资产文件,只是在几天后对它们进行了大修。要么创建一个真正的构建过程,要么等到事情稳定后再过分担心微调。

【讨论】:

【参考方案3】:

您是否已经调用了页面数据库来确定应该使用哪些视图等?可能希望有一个可用于所有页面的主要 js 和 css,然后通过 DB 链接的个别页面仅由某些视图专门使用。

至于缓存...这些文件将被浏览器缓存,只要它们具有相同的请求名称。我通常使用看起来像这样的视图方法对它们进行自动版本化:

function autoversion($filename) 
    $time = filemtime($filename);
    return $filename . '?v=' . $time;

如果您的构建系统可以为您对这些文件进行版本控制,您将获得少量性能提升。

【讨论】:

当我达到这个目标时,我还没有建立任何东西,我有多种选择,所以我希望专家意见和主要文件已经包含在我的计划中 @UserB 有自动构建系统可以在构建时为您的文件版本化,并通过取出任何空白并将它们全部放入一个文件来优化它们。 你能给我详细的吗?在生产环境中实现这一点 @UserB brandonsavage.net/… 请记住,浏览器缓存这些文件是有原因的。不要在此处与 HTTP 作斗争——您可能想在此处使用 filemtime()(尽管它会创建额外的统计调用)。并问自己一个问题:与编辑文件所需的时间相比,用新版本号重命名文件需要多长时间?

以上是关于为大型项目表示 CSS 和 JS 文件的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

在 Nuxt.js 项目中使用 normalize.css 的最佳方式是啥?

Protractor JS 中大型任务的最佳设计模式

读取大文件的最佳方式(例如非常大的文本文档)

大型可扩展 Worklight 企业应用程序的最佳实践和工具

用于连接 JS 和 CSS 文件的工具

通过网络读取和解析大型文本文件的最佳方式是啥?