10

有谁知道通过上传处理​​脚本自动运行某些文件类型的好方法?当我将 CSS 和 Javascript 上传到服务器时,我试图自动完成它们的缩小,在本地保持一个漂亮的、人类可读的版本,同时在服务器上保持一个缩小的版本。我目前在 Windows 上使用 WinSCP,它在某种程度上是可编写脚本的,但可能不够可编写脚本。我可能需要某种拼凑而成的解决方案,所以不要害怕建议一些带有胶带的东西;但是,我确实需要在本地计算机上进行缩小并上传压缩文件,因为我使用共享主机并且无法在服务器上安装垃圾。

谢谢。

4

8 回答 8

7

好吧,缩小 CSS 只是几个正则表达式。

// (PHP) but should be easily portable to any language
function compressCSS($css) {
    return
        preg_replace(
            array('@\s\s+@','@(\w+:)\s*([\w\s,#]+;?)@'),
            array(' ','$1$2'),
            str_replace(
                array("\r","\n","\t",' {','} ',';}'),
                array('','','','{','}','}'),
                preg_replace('@/\*[^*]*\*+([^/][^*]*\*+)*/@', '', $css)
            )
        )
    ;
}

并且 Dean Edwards 的 Javascript 打包器已被移植到PHP、Perl、.NET 和 WSH,因此,如果您使用这些技术中的任何一种,您实际上可以让它在您自己的服务器上运行。...只要记住缓存结果!

于 2009-08-31T21:25:14.967 回答
7

我建议创建一个 makefile 来解决这个特定问题,这是我用于我的站点的快速而肮脏的 makefile:

PUBDIR=../../static/js/
OUTDIR=./build/
COMPRESSOR=../yui/build/yuicompressor-2.4.2.jar
ARGS=
VPATH=${OUTDIR}
INST_TARGETS=${OUTDIR}jgblue.js

jgblue.js: combined.js
    java -jar ${COMPRESSOR} ${ARGS} ${OUTDIR}$< -o ${OUTDIR}$@

combined.js: main.js listview.js tabs.js
    cat $^ > ${OUTDIR}$@

.PHONY: install

install:
    cp ${INST_TARGETS} ${PUBDIR}

然后你只需要输入:

make && make install

首先,它获取您所有的开发文件并将它们连接到一个文件中,然后将连接的文件压缩并复制到您的公共目录中。我正在使用YUICompressor进行压缩,效果很好。

于 2009-08-31T23:46:49.003 回答
5

由于您使用的是共享主机,我只建议使用YUICompressor,并在上传之前通过它运行您的 css/js 文件。确保不要丢失原始文件 - 将来进行更改可能会很痛苦。

您还可以在您的服务器上放置一个脚本,该脚本会定期重写您的 css/js 文件,将它们传递给 minify-process,并在上传后手动调用此脚本。

于 2009-08-31T21:23:33.443 回答
2

我喜欢缩小。它支持动态压缩和修剪 html、javascript 和 css。

它非常灵活,可以集成到现有的应用程序中。

一些更高级的功能是将多个 javascript 文件合并为一个,对于 css 也是如此。它有多种方法来定义要组合的文件,这对于测试目的很有用。这样您就不必每次都修改设置。

于 2009-08-31T21:28:01.250 回答
2

我刚刚在 python 中编写了这个 minfier 脚本。与 Bills 解决方案一样,它使用 YUI 压缩器,但可以在无制造环境中工作。它假定原始(未缩小)文件将位于 /some/path/src/ 中,并且缩小版本应位于 /some/path/ 中。它还假设 yuicompressor jar 文件在当前文件夹中:

import os, glob
from subprocess import Popen,PIPE

def RunCommand( cmd, show_output  ):
    p = Popen(cmd, shell=True,stdout=PIPE,stderr=PIPE)
    for line in p.stdout:
        if show_output:
            print line


    outerr = "\n".join(p.stderr.readlines() )   

    if len(outerr) > 0:
        print "ERROR: " + outerr
        sys.exit()

    code = p.wait()         
    if ( code > 0 ):
        print ("ERROR CODE: %i" % code )
        sys.exit()



compresser = "yuicompressor-2.4.2.jar"
dirs = [ "../wwwroot/css/", "../wwwroot/JavaScript/"]

extensions = ["*.js", "*.css" ]

for dir in dirs:
    src = dir + "/src/"
    for ext in extensions:      
        for path in glob.glob( os.path.join( src, ext)):
            file = os.path.basename(path)
            src_file = os.path.normpath( src + "/" +  file )
            dest_file = os.path.normpath( dir + "/" + file )
            if not os.path.isfile(dest_file) or os.path.getmtime(src_file) > os.path.getmtime(dest_file):
                print "minifying %s..." % (dest_file) 
                command = "java -jar %s %s -o %s" % ( compresser, src_file, dest_file )
                RunCommand(command, True)
于 2009-12-22T20:29:19.443 回答
1

我建议在你的开发机器上压缩(通过某种自动化方式)并在上传到你的实时服务器之前在那里测试它。在部署过程的最后阶段从根本上更改 JavaScript 是引入错误的明显风险。

于 2009-09-01T10:41:03.260 回答
1

非常酷的解决方案,它让 js 和 css 像梦一样自动服务。

检查:http ://code.google.com/p/minify/

特征

  • 将多个 CSS 或 JavaScript 文件合并并压缩到一个下载文件中
    • 使用 Douglas Crockford 的 JSMin 库和自定义类的增强端口来缩小 CSS 和 HTML
    • 缓存服务器端(文件/apc/memcache)以避免做不必要的工作
    • 当浏览器有最新的缓存副本时,响应 HTTP 304(未修改)响应
    • 大多数模块根据需要延迟加载(304 响应使用最少的代码)
    • 自动重写组合 CSS 文件中的相对 URI 以指向有效位置
    • 启用缓存后,Minify 能够在中等强大的服务器上每秒处理数百个请求。
    • 内容编码:gzip,基于请求标头。缓存允许它比 Apache 的 mod_deflate 选项更快地提供 gzip 文件!
    • 大多数组件的测试用例
    • 轻松集成 3rd 方缩小器
    • 用于 HTTP 编码和缓存控制的单独实用程序类enter code here
于 2009-11-10T09:16:00.433 回答
0

两者(JS 和 CSS)都有一个更轻的解决方案,因此您可以“即时缩小”。您应该能够轻松地将其移植到任何语言(目前使用 PHP)。它实际上是 PHP Fat-Free 框架的一个片段和一个组成部分。按照此链接查看我的代码。这只是一个单一的功能。不要寻找诸如组合文件、base-X 编码、缩短变量甚至 gzip 编码之类的花里胡哨(尽管可以轻松添加)。

无脂肪缩小

于 2010-02-20T05:29:40.780 回答