如何管理客户端 JavaScript 依赖项?[已结束]

How can I manage client-side JavaScript dependencies? [closed]

提问人:pathikrit 提问时间:10/15/2012 最后编辑:Peter Mortensenpathikrit 更新时间:11/29/2022 访问量:45517

问:


我们不允许向读者、工具、软件库等寻求推荐的问题。您可以编辑问题,以便用事实和引文来回答。

6年前关闭。

尽管有很好的解决方案可以管理服务器端的依赖关系,但我找不到任何能够满足我拥有连贯的客户端 JavaScript 依赖关系管理工作流程的所有需求的解决方案。我想满足以下五个要求:

  1. 以类似于 npm 的 package.jsonBower 的格式管理我的客户端依赖项bower.json

  2. 它应该可以灵活地指向 Git 存储库或我文件中的实际 JavaScript 文件(无论是在 Web 上还是在本地)对于鲜为人知的库(npm 允许您指向 Git 存储库)dependency.json

  3. 它应该将所有库缩小并命名到一个文件中,例如 Ender - 这是我唯一需要放在客户端标签中的 JavaScript 文件<script>

  4. 它应该像 BoxJS4 一样对 CoffeeScript 提供开箱即用的支持(现已死机)

  5. 在浏览器中,我应该能够使用任何一个 require 样式:

     var $ = require('jquery');
     var _ = require('underscore');
    

    或者更好的是,做 headjs 样式:

     head.js(['jquery', 'underscore', 'mylib'], function($, _, mylib) {
       // Executed when all libraries are loaded
     });
    

如果没有这样的单一工具存在,那么最好的工具组合是什么,即我可以使用Volo(或Grunt)之类的东西组合的工具链?

我已经研究了我在这里链接的所有工具,它们最多只能单独满足我的三个要求。

因此,请不要再发布有关这些工具的信息。我只会接受一个答案,提供满足我所有五个要求的单一工具,或者如果有人发布一个具体的工作流/脚本/工作示例,其中包含多个此类工具的工具链,也满足我的所有要求。

JavaScript npm coffeescript 依赖项管理

评论

6赞 Chandra Sekhar Walajapet 10/15/2012
requirejs.org
1赞 smithclay 10/16/2012
对于将节点语法移植到浏览器的更“节点风格”的解决方案,请考虑 browserifyrequire
1赞 pathikrit 10/17/2012
你能说得更明确一点吗?在我问题的 5 个要点中,我认为 requirejs/browserify 只满足一两点。我正在寻找一种工具(或工具链),可以让我满足所有五个要求
3赞 Guillaume86 11/6/2012
我还没有尝试过,但也许 yeoman.io 也是一个不错的候选人
1赞 dsummersl 2/11/2013
我刚刚听说过 onejs - 听起来有点相关:github.com/azer/onejs

答:

24赞 Chandra Sekhar Walajapet 10/15/2012 #1

我相信,RequireJS 就是你要找的那个。

评论

3赞 pathikrit 10/17/2012
我很困惑。requirejs 究竟如何从互联网上拉入任意 javascript 文件(我不是在谈论其存储库中的 jquery 文件,而是不太著名的文件)?它可以读取package.json文件吗?它不适用于 CoffeeScript......我错过了什么吗??
0赞 pathikrit 10/17/2012
我正在寻找一个满足我所有 5 个要求的单一工具(或多个工具的工具链),我认为(如果我错了,请纠正我) - requirejs 只满足我的五个要点中的一两个
0赞 Ricket 2/22/2013
它满足 2、3 和 5 [编辑:显然它可以编译 coffeescript!它确实为您编译CoffeeScript文件,或者您可以在服务器端执行该操作(例如,当用户请求foo.js时,从磁盘foo.coffee加载,编译并返回它)。而且不需要格式;它不是一个成熟的包管理器。但是,您可以在一个位置指定所有依赖项及其短名称,然后在实际的 require 语句中通过其短名称引用它们。
9赞 Guillaume86 10/18/2012 #2

我很确定 Hem 符合您的要求(我使用带有附加编译器、JadeStylus 的个人分支。它很容易根据您的需求进行定制)。它使用 npm 来管理依赖项。

评论

0赞 dsummersl 10/25/2012
从这个特定问题的阅读来看,我认为这可以很好地解决 1,3,5 问题。对于 #2,您可以将自己的本地 JS 包放在 node_modules 中(它使用本地 npm),并且您可以仅对 git 上的任何依赖项使用 git 子模块。对于 #4,我认为您必须在运行下摆之前自己将咖啡编译为 js(这很容易)。
0赞 Guillaume86 10/25/2012
感谢您的评论,但 hem 编译我的 coffeescript 没有问题 :),它最初是为 Spine 制作的.js wich 是一个面向 coffeescript 的框架,所以这是一个基本要求
0赞 dsummersl 10/25/2012
我知道它适用于像脊柱一样的应用程序(即将咖啡放入应用程序/...),但是包含 coffeescript 的外部模块呢?我想这就是 wrick 要问的,但我可能完全错了......
1赞 Guillaume86 10/25/2012
好的,我不知道它是否为外部模块编译 coffeescript,但我认为它没有用,外部模块通常提供编译后的 JS :)
0赞 dsummersl 10/30/2012
是的,我同意。它进入了制作蛋糕/咕噜声的领域......
2赞 himanshu 10/19/2012 #3

查看 Jam 包管理器。以下是其主页上的描述

对于渴望可维护资产的前端开发人员来说,Jam 是一个 JavaScript 包管理器。与其他存储库不同,我们将浏览器放在首位。

它的工作方式似乎与 npm 非常相似。

安装如下所示的软件包:

jam install backbone

通过执行以下命令使包保持最新:

jam upgrade
jam upgrade {package}

优化生产包装

jam compile compiled.min.js

可以在文件中添加 Jam 依赖项。package.json

有关完整文档,请阅读 Jam 文档

4赞 user18428 10/23/2012 #4

Bower 可能适合您的需求 (1)。(2)对于其余部分,你有RequireJS。

自述文件

Bower 是 Web 的包管理器。Bower 可让您轻松安装图像、CSS 和 JavaScript 等资产,并为您管理依赖项。

要安装软件包,请执行以下操作:

bower install jquery
bower install git://github.com/maccman/package-jquery.git
bower install http://code.jquery.com/jquery-1.7.2.js
bower install ./repos/jquery

评论

0赞 pathikrit 10/24/2012
我已经研究了我在 OP 中链接到的所有内容(包括 Bower),但没有一个恰好满足我 3 个要求中的 5 个以上。我正在寻找一个单一的工具(或工具的组合)来解决我的所有 5 个问题。
0赞 user18428 10/24/2012
不知道这是否值得投反对票,我说 bower+requirejs 可能适合您的需求。你说你也对“最佳工具组合”持开放态度。祝你搜索顺利
0赞 user18428 10/24/2012
这有什么问题:(1) bower (2) 还有 bower (3)requirejs build (4) 你已经安装了节点不是吗?(5) 要求
15赞 dsummersl 10/25/2012 #5

作为 Guillaume86,我认为 Hem 会让你最接近你想去的地方。

在 Hem 中,依赖项使用 npm 和 Hem 的组合进行管理。使用 npm 显式安装所有项目的外部依赖项。使用 Hem 指定应为客户端操作拼接在一起的依赖项(外部和本地)。

我创建了一个骨架项目,所以你可以看到它是如何工作的。您可以在客户端下摆上看到它。

添加依赖项

使用 npm 搜索特定的依赖,然后修改package.json文件,以确保将来跟踪该依赖。然后指定 应用程序在 slug.json 中的依赖项。

例如,假设您要添加 CoffeeScript 依赖项。只需使用 npm 安装依赖项并将其保存到您的 package.json 文件中:

  1. npm --save install coffee-script
  2. 手动编辑slug.json文件。将“coffee-script”添加到“dependencies”中。

假设您想包含自己的模块“bloomfilters”,但它不在 npm 注册表中。您可以通过以下方式将其添加到您的项目中:

  1. npm --save install https://github.com/dsummersl/bloomfilters/tarball/master
  2. 手动编辑slug.json文件。将“bloomfilters”添加到“dependencies”中。

本地模块

如果您想包含自己的 CoffeeScript 或 JavaScript 代码,可以通过将这些文件添加到 app/ 文件夹来实现。请注意,为了通过“require”方法公开您的脚本,您必须使其成为 CommonJS 模块。这很简单,请参阅 Hem 文档

本地文件

如果你想包含非 CommonJS 非“require”代码,你也可以通过 'libs' 列表中引用你的自定义 JavaScript 或 CoffeeScript 代码来拼接它 文件slug.json

CSS的

如果你愿意,Hem 也会把你的 CSS 拼接在一起。请参阅 Hem 文档

建筑

列出依赖项后,可以使用下摆将它们全部缝合在一起。

# Make sure all dependencies are present:
npm install .

# Make public/application.js
hem build

# See your minified js in public/application.js

笔记

Hem 是为 Spine.js 项目准备的 - 但你不必为此使用它。随心所欲地忽略任何提及脊柱的文档......

5赞 MarcoK 2/18/2013 #6

您可能想看看 Yeoman,它使用多种技术来帮助您满足您的要求。

我们的工作流程由三种工具组成,用于改善您的 构建 Web 应用程序时的工作效率和满意度:Yo ( 脚手架工具)、Grunt(构建工具)和 Bower(用于包) 管理)。

内置对 CoffeeScript、Compass 等的支持。它适用于r.js(RequireJS),单元测试等。

至于您的要求:

  1. Bower 用于依赖项管理
  2. Bower 可以处理本地文件、git://、http:// 等
  3. 内置对缩小和串联的支持(甚至适用于您的图像)
  4. 内置支持自动编译 CoffeeScript 和 Compass(使用 LiveReload)
  5. 正如构建过程中所述:如果您使用的是 AMD,我将通过 r.js 传递这些模块,这样您就不必这样做了。

所有功能:

闪电般的脚手架 — 轻松搭建新项目的脚手架 可自定义的模板(例如 HTML5 Boilerplate、Twitter Bootstrap)、RequireJS 等。

出色的构建过程 — 您不仅可以获得 缩小和串联;我还优化了您所有的图像文件, HTML,编译 CoffeeScript 和 Compass 文件(如果使用 AMD,我将通过 r.js 传递这些模块,这样您就不必这样做了。

自动编译 CoffeeScript & Compass — 我们的 LiveReload 手表 进程自动编译源文件并刷新浏览器 每当进行更改时,您就不必这样做。

自动 lint 脚本 — 所有脚本都会自动针对 JSHint 运行,以确保它们遵循语言最佳实践。

内置预览服务器 — 不再需要启动自己的 HTTP 服务器。我的内置 只需一个命令即可发射一个。

令人敬畏的图像优化 — 我使用 OptiPNG 和 JPEGTran 优化您的所有图像,以便您的用户可以花更少的时间下载资产,而将更多的时间用于使用您的应用程序。

杀手级包管理 — 需要依赖?这只是一个击键 離開。我允许您通过 命令行(例如),安装它们并保留它们 无需打开浏览器即可更新。bower search jquery

PhantomJS 单元测试 — 通过 PhantomJS 在无头 WebKit 中轻松运行单元测试。什么时候 您创建一个新应用程序,我还包含一些测试脚手架 您的应用。

11赞 Floby 2/18/2013 #7

还有 Browserify

  1. 支持package.json格式
  2. 在下面使用 npm,它可以使用 GitHub(或任何 Git)存储库作为包源
  3. 缩小所有依赖项并将其连接到单个文件中。
  4. 如果将 CoffeeScript 包含在依赖项中,则支持它
  5. 要求风格一路走来。
  6. 支持源映射

评论

0赞 Connor Leech 5/21/2014
您可以将任何 GitHub 存储库(或 Bower 包)与 Browserify 一起使用吗?这需要类似或不需要的东西吗?npmjs.org/package/napanapa
1赞 JoelKuiper 2/19/2013 #8

有几个选项:

组件也可能引起人们的兴趣。它本身不管理依赖项,但它允许您使用其他大型库的切碎版本。

44赞 Jean-Philippe Leclerc 2/20/2013 #9

RequireJS 可以满足您的一切需求。

我对这个问题的回答可能会对您有所帮助。

例:

客户端应用项目层次结构:

sampleapp
    |___ main.js
    |___ cs.js
    |___ require.js

main.js 是初始化客户端应用程序并配置 RequireJS 的地方:

require.config({
    baseUrl: "/sampleapp",
    paths: {
        jquery: "libs/jquery", // Local
        underscore: "http://underscorejs.org/underscore-min.js", // Remote
        backbone: "https://github.com/documentcloud/backbone/blob/master/backbone-min.js" // Remote on GitHub
    },
    shim: {
        backbone: {
            deps: ["underscore", "jquery"] // Backbone depends on jQuery and Underscore.js
        }
    }
});

require(["cs!someCoffeescriptFile", "jquery", "backbone", "underscore"], function (SomeCoffeescriptFile, $, Backbone, _) {
    // Dependencies are loaded...
    // Execute code
});

依赖项将在前面加上“cs!”时使用 cs 插件。cs 插件编译 CoffeeScript 文件。

当你进入生产环境时,你可以用 r.js 预编译整个项目。

node ./node_modules/requirejs/bin/r.js -o buildclientconfig.js

以下是您的要求:

  • 以类似于 npm 的格式管理我的客户端依赖项 package.json 或 Bowercomponent.json 文件。不同但一样好!

  • 我应该可以灵活地指向 Git 存储库或我的 dependency.json 文件中的实际 JavaScript 文件(无论是在 Web 上还是在本地),用于鲜为人知的库(npm 允许您指向 Git 存储库)。是的

  • 它应该将所有库缩小并命名到一个文件中,例如 Ender。这是我唯一需要放在客户端的脚本标签中的 JavaScript 文件。是的,使用 r.js。

  • 它应该像 Box 一样对 CoffeeScript 提供开箱即用的支持。是的

  • 在浏览器中,我可以使用 require style 或 headjs。是的

评论

0赞 Domi 4/28/2014
如果我使用 ,我可以简单地拉入所有库的非缩小版本,或者我应该如何在缩小和非缩小库之间做出决定?r.js
0赞 pronebird 8/26/2014
唯一的问题是这个需要JS废话,你必须携带缩小的代码。
1赞 Adam B 10/26/2014
@Andy不一定!你可以用杏仁来代替,它要小得多!
1赞 Andrew Mao 2/21/2013 #10

我将 Hem 与 npm 一起使用,我想添加一些我认为到目前为止尚未涵盖的额外好处。

  • Hem 有一个独立的 Web 服务器 (Strata),因此您甚至可以开发代码,甚至不需要重新编译。除非我正在发布应用程序,否则我从不使用。hem build
  • 您无需使用 Spine.js 即可使用 Hem。如果正确设置了文件slug.json,则可以使用它来编译任意 CoffeeScript 包。这是我的一个包,它是用cakefile自动编译的:TurkServer
  • 说到上述内容,Hem 允许您使用 npm 链接将本地系统上的其他依赖项链接起来,即使您使用 Strata 服务器,也可以将它们无缝组合在一起。事实上,您甚至不需要使用上述方法;您可以从依赖项目直接链接到 CoffeeScript。cake
  • Hem 支持(嵌入式 CoffeeScript)用于视图和 Stylus 用于 CSS,并将所有这些以及您的 CoffeeScript 代码编译为一个 JavaScript 文件和一个 CSS 文件。eco

下面是设置 Spine.js、Hem 和 CoffeeScript 应用程序的基本列表。随意忽略 Spine.js 部分。事实上,有时我习惯于为非Spine.js应用程序设置目录结构,然后编辑文件slug.json以更改为不同的编译结构。spine app

  1. 安装 NPM:在类 Unix 系统上。我假设它可以从命令行获得。curl http://npmjs.org/install.sh | sh

  2. 全局安装 Hem ()。开发最近已经分支了,所以你可能想直接从 GitHub 中获取它,签出一个分支,然后在该文件夹中。npm install -g hemnpm install -g .

  3. npm install -g spine.app将作为全局命令提供spine

  4. spine app folder将制作一个 Spine 项目调用 ,生成正确的目录结构和一堆骨架文件以开始。appfolder

  5. cd 到文件夹并编辑所需库的文件dependencies.json。将它们添加到文件slug.json,以便 Hem 也知道在哪里可以找到它们。

  6. 可选:将开发中的任何本地包添加到文件夹node_modules,您可以将它们添加到 Hem 的文件slug.json(直接包含索引.js文件,或者如果希望 hem 编译它,则可以添加 index.coffee 文件。npm link

  7. npm install .下载您刚刚输入的所有依赖项。

  8. 如果你看一下默认的脊柱配置,就会发现你从依赖项中需要的所有库。例子:app/lib/setup.coffeerequire

     # Spine.app had these as dependencies by default
     require('json2ify')
     require('es5-shimify')
     require('jqueryify')
    
     require('spine')
     require('spine/lib/local')
     require('spine/lib/ajax')
     require('spine/lib/manager')
     require('spine/lib/route')
    
     # D3.js was installed via file 'dependencies.json'
     require 'd3/d3.v2'
    
  9. 在文件 index.coffee 中,您只需执行并加载应用程序的主控制器即可。此外,您需要对其他控制器中的任何其他类执行此操作。您可以使用或生成控制器和模型的模板。典型的Spine控制器如下所示,使用Node.js':require lib/setuprequirespine controller somethingspine model somethingrequire

     Spine = require('spine')
     # Require other controllers
     Payment = require('controllers/payment')
    
     class Header extends Spine.Controller
       constructor: ->
         # Initialize the class
    
       active: ->
         super
         @render()
    
       render: ->
         # Pull down some eco files
         @html require('views/header')
    
     # Makes this visible to other controllers
     module.exports = Header
    
  10. 默认生成的 index.html 文件通常可以加载应用程序,但会根据需要进行修改。根据您的要求,它只提取一个 .js 和一个 .css 文件,您永远不需要修改它们。

  11. 根据需要在 css 文件夹中编辑触控笔文件。它比CSS灵活得多:)

  12. 从 运行以启动 Hem 服务器,然后导航到以查看您的应用程序(如果全局安装了 Hem)。它有一些隐藏的参数,例如,侦听所有端口。folderhem serverlocalhost:9294--host 0.0.0.0

  13. 使用适当的 MVC 技术构建应用程序的其余部分,并使用触笔进行 CSS,将 eco 用于视图。或者根本不使用 Spine,Hem 仍然可以很好地与 CoffeeScript 和 npm 配合使用。有许多使用这两种模型的项目示例。

还有一件事:通常,当您更新代码和保存文件时,会自动更新,这使得调试变得轻而易举。运行会将应用程序编译为两个文件,即缩小的 和 。如果在此之后运行,它将使用这些文件,并且不再自动更新。因此,在您真正需要应用程序的缩小版本进行部署之前,不要这样做。hem serverhem buildapplication.jsapplication.csshem serverhem build

其他参考资料:脊柱.js和下摆:入门

0赞 Christophe 2/23/2013 #11

我建议查看 Dojo Toolkit,它似乎可以满足您的大部分要求。我不确定的是 CoffeeScript。

Dojo 使用以异步模块定义 (AMD) 格式编写的模块。它有一个带有包的构建系统,您可以将它们聚合到一个或多个文件(称为层)中。显然,它接受 Git 类型的存储库,有关构建系统的更多详细信息,请参阅创建构建

根据记录,v1.9 测试版预计将于下个月发布。

1赞 Daniel X Moore 9/30/2013 #12

这里有一个解决方案,它采用了一种非常不同的方法:将所有模块打包到一个 JSON 对象中,并通过读取和执行文件内容来要求模块,而无需额外的请求。

纯客户端演示实现:http://strd6.github.io/editor/

https://github.com/STRd6/require/blob/master/main.coffee.md

STRd6/require 依赖于在运行时是否有一个可用的 JSON 包。该函数是为该包生成的。该包包含应用可能需要的所有文件。不会再发出 HTTP 请求,因为包捆绑了所有依赖项。这与客户端上的 Node.js 样式要求尽可能接近。require

该包的结构如下:

entryPoint: "main"
distribution:
  main:
    content: "alert(\"It worked!\")"
  ...
dependencies:
  <name>: <a package>

与 Node.js 不同,包不知道其外部名称。由包(包括依赖项)来命名它。这提供了完整的封装。

鉴于所有这些设置,这里有一个从包中加载文件的函数:

loadModule = (pkg, path) ->
  unless (file = pkg.distribution[path])
    throw "Could not find file at #{path} in #{pkg.name}"

  program = file.content
  dirname = path.split(fileSeparator)[0...-1].join(fileSeparator)

  module =
    path: dirname
    exports: {}

  context =
    require: generateRequireFn(pkg, module)
    global: global
    module: module
    exports: module.exports
    PACKAGE: pkg
    __filename: path
    __dirname: dirname

  args = Object.keys(context)
  values = args.map (name) -> context[name]

  Function(args..., program).apply(module, values)

  return module

此外部上下文提供了模块有权访问的一些变量。

函数向模块公开,因此它们可能需要其他模块。require

还会公开其他属性,例如对全局对象的引用和一些元数据。

最后,我们在模块和给定的上下文中执行程序。

这个答案对于那些希望在浏览器中使用同步 Node.js 样式的 require 语句并且对远程脚本加载解决方案不感兴趣的人最有帮助。

1赞 Brave Dave 1/14/2014 #13

如果您在后端使用 Node.js 或 Express.js,请查看 Cartero

0赞 pathikrit 11/16/2014 #14

另一个满足我最近发布的所有标准的框架是 http://duojs.org/(它还支持将其他资源(如 CSS)视为依赖项)。

评论

0赞 Peter Mortensen 11/29/2022
链路已断开(超时 — “504 网关超时”)。
0赞 fantasyni 12/25/2014 #15

RequireJS 相比,具有异步加载和 Browserify依赖注入将是另一个不错的选择。

asynchronous-frontend-dependency-management-without-AMD

评论

1赞 Nathan Tuggy 12/25/2014
这有点稀疏。最好在此处包含更多答案,并提供链接以供参考。
2赞 Veverke 5/7/2015 #16

我刚刚遇到了注入.js

项目网站的一些功能:

Inject(Apache 软件许可证 2.0)是一种革命性的方法,以与库无关的方式管理您的依赖项。它的一些主要功能包括:

  • 浏览器中的 CommonJS 合规性 (exports.*)
  • 查看完整的 CommonJS 支持矩阵
  • 跨域检索文件(通过easyXDM)
  • localStorage(加载一次模块)

评论

0赞 Mardok 10/17/2015
我喜欢注射。它比 RequireJS 干净得多,几乎与使用 node 编写完全相同。