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

时间:2008-11-19 10:13:32

标签: javascript batch-file compression

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

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

copy / A * .js compiled.js / Y

其他人在做什么?

10 个答案:

答案 0 :(得分: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>

答案 1 :(得分:11)

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

copy /B *.js compiled.js /Y

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

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

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

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

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

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

答案 2 :(得分: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>

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

答案 3 :(得分:5)

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

sudo npm -g install uglify-js

然后可以使用以下命令连接和压缩所有js文件。

cat myAppDir/*.js | uglifyjs > build/application.js

答案 4 :(得分:4)

我们已经创建了一个由以下部分组成的机制:

  • minfication(对于js和css)
  • 包中的聚合
  • 缓存(http状态304内容)
  • 以开发模式发送原始文件

这可能对您的需求来说太多了,但是为了回答您的问题其他人做了什么,以下是它的工作原理:

  1. 请求进来,比方说, /css.aspx?package=core
  2. 我们在xml配置文件中查找packagename(其中 例如声明 包“core”包含文件 /js/mootools.js和 /js/swfobject.js)
  3. 我们检查是否启用了缩小。例如,在 我们没有开发环境 想要缩小的js内容 服务了,但改为写 原始文件。对于js,这已经完成了 通过document.writes的脚本 包括,对于CSS,我们编写导入规则。
  4. 如果需要缩小(在生产环境中),我们会检查请求中的if-modified-since标头。如果此客户端已经具有缩小的内容,我们发送http标头304.如果客户端确实需要内容,我们检查我们是否在缓存中缩小了内容并提供了该内容。否则,我们缩小并发送结果。
  5. 所有这些都在单独的服务中分解。在jsminificationwriter服务中注入了缓存服务。这使用了原来的minificationservice,它只关注缩小规则。

    这种方法的好处是:

    • 它迫使我们的开发团队在js / css“包”中思考,因此正确地分割功能并将它们分发到需要它们的页面上。
    • 在开发过程中,您完全可以调试,获取正确的文件和行号。
    • 您可以连接任何其他缩小服务实现,例如YUI等。 JsMin只是我们的第一次拍摄。
    • 这是适用于不同内容类型的一般方法。

    希望这会有所帮助。如果你愿意,我可以发布一些代码片段来说明它。

答案 5 :(得分:4)

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

我还想提一个非常非常有趣的技术,它被用在像jQuery和Modernizr这样的大型项目中。这两个项目都是用requirejs模块完全开发的,然后他们使用requirejs optimizer作为一个非常聪明的连接器。有趣的是,正如你所看到的,jQuery和Modernizr都不需要requirejs来工作,这是因为它们删除了requirejs的合成仪式,以便在代码中摆脱requirejs。因此,他们最终得到了一个使用requirejs模块开发的独立库!由于这一点,他们能够执行其库的cutom构建,以及其他优点。 Here是一篇博文,详细解释了所有这些内容。

答案 6 :(得分:3)

你也可以这样做:

type *.js > compiled.js

答案 7 :(得分:3)

我将第二个yuicompressor,但我使用/ packer /

http://johannburkard.de/blog/programming/javascript/automate-javascript-compression-with-yui-compressor-and-packer.html

这对我来说非常好。

答案 8 :(得分:0)

您还可以尝试wro4j(用于java的Web资源优化器),它可以用作构建工具(maven插件),运行时解决方案(使用过滤器)或命令行工具。它允许您轻松地保持资源组织并使用十几台压缩​​器为您处理合并,以获取机器人类型的资源:js和css。

定义合并资源很简单:

<groups xmlns="http://www.isdc.ro/wro">
  <group name="all">
    <css>/asset/*.css</css>
    <js>/asset/*.js</js>
  </group>
</groups>  

免责声明:我是这个项目的提交者。

答案 9 :(得分:0)

我知道这是一个非常老的问题,但是为了完整起见,我将提到与Browserify一起使用的选项。它允许您使用NPM的require函数来解决依赖关系,从而将项目构建为不同的模块,然后解决这些依赖关系,并将整个项目连接到一个文件中。

例如,假设您的项目名为 FooBar ,而您想输出一个名为foobar.js的文件。您将创建一个main.js文件作为该项目的入口点,要求其中应包含所有模块。

main.js

require("./doFoo");
require("./doBar");

然后运行:

browserify main.js -o foobar.js

或者,要在每次源文件更改时自动执行此操作,您也可以使用Watchify

watchify main.js -o foobar.js

Browserify还将解决模块之间的依赖关系。例如,如果doBar.js依赖于doQux.js ...

doBar.js

require("./doQux");
const doBar = ()=>{
    //Do some bar stuff.
}
exports.doBar = doBar;

然后,Browserify将确保将doQux.js包含到foobar.js中,这样您就不会有任何损坏的依赖项。