如何将JavaScript文件连接到一个文件中?

Phi*_*ent 35 javascript compression batch-file

我想为我的网站创建一个已编译的JavaScript文件.对于开发,我宁愿将JavaScript保存在单独的文件中,只是作为我的自动脚本的一部分将文件连接成一个并在其上运行压缩器.

我的问题是,如果我使用旧的DOS复制命令,它还会输入压缩器抱怨的EOF标记:

copy/A*.js compiled.js/Y.

其他人在做什么?

Dav*_*man 35

我建议使用Apache Ant和YUI Compressor.

http://ant.apache.org/

http://yui.github.com/yuicompressor/

在Ant build xml中添加这样的东西.它将创建两个文件,application.js和application-min.js.

<target name="concatenate" description="Concatenate all js files">
    <concat destfile="build/application.js">
        <fileset dir="src/js" includes="*.js" />
    </concat>
</target>

<target name="compress" depends="concatenate" description="Compress application.js to application-min.js">
    <apply executable="java" parallel="false">
        <filelist dir="build" files="application.js" />
        <arg line="-jar" />
        <arg path="path/to/yuicompressor-2.4.2.jar" />
        <srcfile />
        <arg line="-o" />
        <mapper type="glob" from="*.js" to="build/*-min.js" />
        <targetfile />
    </apply>
</target>
Run Code Online (Sandbox Code Playgroud)

  • 几年前我停止使用Ant.现在我使用Node来做这些事情.看看这个:http://mechanics.flite.com/blog/2012/06/19/why-we-use-node-dot-js-and-grunt-to-build-javascript/ (4认同)
  • 这为我提出了一个'Unexpected element"{}目标"{antlib:org.apache.tools.ant} target`错误.有任何想法吗? (2认同)

eug*_*nsk 11

要在没有EOF的情况下复制使用二进制模

copy /B *.js compiled.js /Y
Run Code Online (Sandbox Code Playgroud)

如果生成的文件仍有EOF,可能来自其中一个原始文件,则可以通过以下变体修复:

copy /A *.js compiled.js /B /Y
Run Code Online (Sandbox Code Playgroud)

/ A从原始文件中删除尾随EOF(如果有)和/ B阻止将EOF附加到生成的文件中.如果EOF不在最后,源文件将被截断.开关的顺序很重要.如果你写

copy /A *.js /B compiled.js /Y  
Run Code Online (Sandbox Code Playgroud)

- 源文件中的EOF不会被删除,但仍然不会附加结果EOF.

亲自尝试一下,这就是我得到它的地方.DOS命令很奇怪.

  • 好像我明白了,是一个UTF8前缀字节.它应该在文件的最开头,否则它被视为数据并且您的编译器会对其进行投诉.这不是EOF问题.你不能使用副本. (2认同)

Pun*_*ora 6

在asp.net AJAX中,您可以使用'CompositeScript'标记.这会将所有脚本合并为1个大js文件,通过减少http 304s和http 401s的数量来节省带宽.

样品:

 <asp:ScriptManager ID="ScriptManager1" runat="server">
        <CompositeScript>
            <Scripts>
                <asp:ScriptReference Path="~/Scripts/Script1.js" />
                <asp:ScriptReference Path="~/Scripts/Script2.js" />
                <asp:ScriptReference Path="~/Scripts/Script3.js" />
            </Scripts>
        </CompositeScript>
    </asp:ScriptManager>
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此处:http: //msdn.microsoft.com/en-us/library/cc488552.aspx


Aug*_*nta 6

这是一个非常古老的问题,但我想提一下,还有使用 javascript 连接 javascript 的方法!使用 nodejs 显然......例如,有像这样的npm 模块发布的工具 ,也有gruntgulp插件。

我还想提到一个非常非常有趣的技术,它正在像 jQuery 和 Modernizr 这样的大型项目中使用。这两个项目完全是用 requirejs 模块开发的,然后他们使用requirejs 优化器作为一个非常智能的连接器。有趣的是,正如您所看到的,jQuery 和 Modernizr 都不需要 requirejs 才能工作,这是因为它们删除了 requirejs 语法规则,以便在代码中去掉 requirejs。所以他们最终得到了一个用 requirejs 模块开发的独立库!多亏了这一点,他们能够执行库的 cutom 构建,以及其他优势。是一篇博客文章,更详细地解释了所有这些。


Fer*_*gal 5

在您的机器上安装压缩机uglifyjs:

sudo npm -g install uglify-js
Run Code Online (Sandbox Code Playgroud)

然后,以下命令可用于连接和压缩所有js文件.

cat myAppDir/*.js | uglifyjs > build/application.js
Run Code Online (Sandbox Code Playgroud)