【问题标题】:Combine and Minify Multiple CSS / JS Files合并和缩小多个 CSS / JS 文件
【发布时间】: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 中引入类似的东西,以便在“调试”中脚本单独呈现且未缩小,但在“发布”中它们被组合和缩小

标签: javascript css optimization yui-compressor http-compression


【解决方案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
                  

                  【讨论】:

                  • 我发现的最简单的方法/概念应该可以完美运行,即使我完全使用不同的语言。我现在的想法是将它变成各种缓存文件并让页面调用它。谢谢。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多