合并和缩小多个 CSS / JS 文件

Posted

技术标签:

【中文标题】合并和缩小多个 CSS / JS 文件【英文标题】:Combine and Minify Multiple CSS / JS Files 【发布时间】:2012-03-06 11:11:45 【问题描述】:

我正在尝试通过合并和压缩 CSS 和 JS 文件来优化网站性能。我的问题更多是关于如何实现这一目标的(具体)步骤,考虑到我面临的真实情况(不过,其他开发人员也应该是典型的)。

我的页面引用了几个 CSS 和 JS 文件,如下所示:

<!--
  It's easier to work on smaller files during development.
  Hence, the multiple CSS and JS files.
-->
<link type="text/css" rel="stylesheet" href="/css/main.css" />
<link type="text/css" rel="stylesheet" href="/css/secondary-1.css" />
<link type="text/css" rel="stylesheet" href="/css/secondary-2.css" />

<script type="text/javascript" src="/scripts/js/main.js"></script>
<script type="text/javascript" src="/scripts/js/adapter/adapter.js"></script>
<script type="text/javascript" src="/scripts/js/adapter/title-adapter.js"></script>

对于生产版本,我想将 3 个 CSS 文件合并为一个,并使用例如缩小它。 YUI Compressor。但是,我需要更新所有需要这 3 个文件以引用新缩小的 CSS 的页面。这似乎很容易出错(例如,您要在许多文件中删除和添加一些行)。还有其他风险较低的方法吗? JS 文件也是同样的问题。

【问题讨论】:

我希望他们在新的 asp.net 4.5 中引入类似的东西,以便在“调试”中脚本单独呈现且未缩小,但在“发布”中它们被组合和缩小 【参考方案1】:

查看minify - 它允许您将多个 js、css 文件合并为一个,只需将它们堆叠到一个 url 中,例如

<script src="/scripts/js/main.js,/scripts/js/adapter/adapter.js"></script>

我们已经使用它多年了,它做得很好,并且可以即时完成(无需编辑文件)。

【讨论】:

嗨面条,它不适合我。它为该脚本 src 提供了 404。我用过 - 【参考方案2】:

我认为YUI Compressor 是最好的。它缩小了 JS 和 CSS,甚至去除了人们用于低级 JavaScript 调试的那些 console.log 语句。

Check out how easy it is.

如果你使用 svn/git,你可以在 ant 任务中启动它,因此将它包含到你的 post/pre-commit 钩子中。

更新: 现在我将 grunt 与 concat、minify 和 uglify 贡献一起使用。您可以将它与观察者一起使用,以便在您更改源时在后台创建新的缩小文件。 uglify contrib 不仅会去除控制台日志,还会去除未使用的函数和属性。

请参阅this tutorial 了解简要信息。

更新: 如今,人们从 grunt 及其前身“gulp”中退了出来,并使用 npm 作为构建工具。阅读它here。

更新: 所以现在人们使用yarn 来运行npm。难怪;纱线图标是一只猫。 大多数当前框架使用webpack 将资源捆绑到包中,然后由minification 处理。

【讨论】:

来自上面的链接目前它不支持最小化 CSS 文件,即使这是 YUI Compressor 的一个功能。 YUI Compressor 网站上写着:“YUI Compressor 还能够通过使用 Isaac Schlueter 的基于正则表达式的 CSS minifier 的端口来压缩 CSS 文件。”另外:yui.github.io/yuicompressor/css.html 工作流解决方案的伟大历史,期待下一次更新! 有什么更新吗?现在人们都在做什么? @Xsmael:我添加了一个更新的更新【参考方案3】:

我需要更新所有需要这 3 个文件以引用新缩小的 CSS 的页面。

首先我会说你应该有共同的标题。所以它不需要在任何时候都改变所有的标题。最好使用单头或 2-3。因此,当您的页面需要时,您可以更改标题。因此,无论何时您想扩展您的网络应用程序,它都会降低风险和繁琐。

您还没有提到您的开发环境。你可以看到有many compressing tools listed for different environments。而且您正在使用好工具,即 YUI Compressor。

【讨论】:

【参考方案4】:

我没有看到您提到内容管理系统(Wordpress、Joomla、Drupal 等),但如果您使用任何流行的 CMS,它们都有可用的插件/模块(也有免费选项),可以缩小和缓存您的 css 和js.

使用插件使您能够保持未压缩版本可供编辑,然后在进行更改时,插件会自动包含您的更改并重新压缩文件。只要确保您选择了一个插件,它可以让您排除文件(例如自定义 js 文件),以防它破坏任何东西。

我过去曾尝试手动保存这些文件,但它总是变成维护的噩梦。祝你好运,希望这会有所帮助。

【讨论】:

【参考方案5】:

如果您对所提供的文件进行任何预处理,您可能需要设置一个适当的构建系统(例如 Makefile)。这样,您就有了一些没有重复的源文件,并且每当您进行更改时,您都会运行“make”,它会更新所有自动生成的文件。如果已经有一个构建系统,请了解它的工作原理并使用它。如果没有,您需要添加一个。

首先,弄清楚如何从命令行组合和缩小文件(YUICompressor 文档涵盖了这一点)。为自动生成的东西指定一个目录,与你工作的东西分开,但 Web 服务器可以访问,然后输出到那里,例如 gen/scripts/combined.js。将您使用的命令放入 Makefile,并在每次进行更改并希望它生效时重新运行“make”。然后更新其他文件中的标题以指向合并和缩小的文件。

【讨论】:

【参考方案6】:

我最终使用CodeKit 连接我的 CSS 和 JS 文件。我发现真正有用的功能是能够在文件保存时进行连接;因为它监控各自的 CSS / JS 资产。一旦我将它们正确组合,例如到1个CSS和1个JS文件,其他文件都可以参考这2个。

您甚至可以要求 CodeKit 进行即时缩小/压缩。

免责声明:我与 CodeKit 没有任何关系。我在网上随机找到了它,它在我的开发过程中成为了一个很棒的工具。自从我一年多前第一次使用它以来,它还提供了很好的更新。

【讨论】:

这仅适用于 mac...wht abt windows?? 我使用 CodeKit 并且喜欢它...除了使用 git 将项目签出到新分支会杀死我的 js 连接。准备开始使用 npm。【参考方案7】:

对于那些想要更轻量和更灵活的东西的人,我今天创建了js.sh 来解决这个问题。这是一个针对 JS 文件的简单命令行工具,可以轻松修改以处理 CSS 文件。好处:

易于配置,供多个开发人员在一个项目中使用 按照 script_order.txt 中指定的顺序组合 JS 文件 使用 Google 的 Closure Compiler 压缩它们 尽可能将 JS 拆分为 生成一个带有 &lt;script&gt; 标记的小型 php 文件,您可以在适当的地方包含该标记 用法:js.sh -u yourname

它可以进行一些改进,但对于我的用例来说,它比我迄今为止看到的所有其他解决方案都要好。

【讨论】:

【参考方案8】:

优化的第一步是文件最小化。 (我强烈推荐GULP进行最小化和优化。它的简单watch解决方案,安装和所有文件一次压缩。支持所有CSS,JS,less,sass等...)

或者老派的解决方案:

1) 一般来说,作为一个优化过程,为了优化站点性能,可以尝试将所有 CSS 合并到一个文件中,并使用Compass 压缩文件。这样,您对静态 CSS 的多个请求将被替换为单个请求。

2) 您可以使用 CDN(或 Google 托管库)解决多个 JS 的问题,因此请求会转到其他服务器而不是您的服务器。这样服务器在发送下一个之前不会等待上一个请求完成。

3) 如果您有自己的本地存储的 JavaScript,请使用 Brackets 插件“压缩 JavaScript”最小化每个文件。基本上一键压缩 JavsScript。Brackets 是为 CSS 和 JS 制作的免费编辑器,但可用于 PHP 和其他语言。有很多插件可供前端和后端开发人员选择。一般来说,“一键”可以完成所有这些(到目前为止是多个)命令。顺便说一句,括号取代了我非常昂贵的 Dreamweaver ;)

3) 尝试使用Sass、Compass、less 等工具来最小化 CSS。

注意:即使不使用 SASS 混合或变量,您的 CSS 也会被压缩(只需简单地使用纯 CSS 和 Compass“watch”命令将为您压缩它)。

我希望这会有所帮助!

【讨论】:

【参考方案9】:

在我的 symfony 项目中,我做了这样的事情

# layout.html.twig #

% block styles %
    % if app.environment == 'prod' %
        <link href=" asset('bundles/appmain/min.css') " rel="stylesheet" type="text/css" />
    % else %
        <link href=" asset('bundles/appmain/hello.css') " rel="stylesheet" type="text/css" />
        <link href=" asset('bundles/appmain/world.css') " rel="stylesheet" type="text/css" />
    % endif %
% endblock %
# some-view.html.twig #

% extends 'AppMainBundle::layout.html.twig' %

% block styles %
     parent() 

    % if app.environment != 'prod' %
        <link href=" asset('bundles/appsecond/styles.css') " rel="stylesheet" type="text/css" />
    % else %
% endblock %

当dev版本准备好生产时,我使用this script合并所有css文件并替换min.css的内容。

但这个解决方案只有在所有页面中都包含相同的 css 文件时才有效。

【讨论】:

【参考方案10】:

现在是 2015 年,imo 使用 gulp 最简单的方法 - http://gulpjs.com/。 使用 gulp-uglify 压缩 js 脚本和 gulp-minify-css 压缩 css 的代码非常简单。 Gulp 绝对值得一试

【讨论】:

【参考方案11】:

您可以使用由著名的 YUI 压缩器构建的 cssmin 节点模块

$ npm -g i cosmic # install

# Usage   
var puts = require('util').puts,
fs = require('fs'),
cssmin = require('./cssmin');
var css = fs.readFileSync("/Any/Random/CSS/File.css", encoding='utf8');
var min = cssmin(css);
puts(min);

【讨论】:

【参考方案12】:

Windows 用户的快速提示,如果您只想连接文件:

在所需位置打开一个 cmd,然后使用“type”将文件通过管道传输到文件

例如:

type .\scripts\*.js >> .\combined.js

如果您的脚本顺序很重要,您必须按所需顺序明确键入文件

我在 bat 文件中为我的 angular/bootstrap 项目使用 this

del combos.js

type .\lib\jquery.min.js >> .\combos.js
type .\lib\bootstrap.min.js >> .\combos.js
type .\lib\Angular\angular.min.js >> .\combos.js
type .\lib\Angular\angular-route.min.js >> .\combos.js
type .\lib\Angular\angular-sanitize.min.js >> .\combos.js

type .\app.js >> .\combos.js
type .\services\*.js >> .\combos.js
type .\controllers\*.js >> .\combos.js

【讨论】:

我发现的最简单的方法/概念应该可以完美运行,即使我完全使用不同的语言。我现在的想法是将它变成各种缓存文件并让页面调用它。谢谢。

以上是关于合并和缩小多个 CSS / JS 文件的主要内容,如果未能解决你的问题,请参考以下文章

System.Web.Optimization 合并压缩技术的使用

如何使用 Grunt.js (0.3.x) 连接和缩小多个 CSS 和 JavaScript 文件

使用 npm 连接和缩小 HTML/CSS/JS 文件?

PHP根据传入参数合并多个JS和CSS文件的简单实现

在 .net 中缩小和合并文件

Django:在发布前自动缩小 css/js 文件