如何下载JS游戏?


20

我可以将HTML和JavaScript放在同一.html文件中,但是图像必须是单独的文件。我想到的唯一解决方案是给用户一个.zip文件夹。

虽然这还不是很漂亮...我还能怎么做?


8
“标准” 不是使JS游戏可下载;它们只能在浏览器中使用。可能有一些晦涩的方法可以做到这一点,但坦率地说为什么要这么做:使用正确的工具完成工作。
鸣叫

Answers:


21

您可以使用dataurl-syntax将图像嵌入HTML文档中,该语法允许将二进制图像数据的base64表示形式作为图像的src属性。这也适用于任何其他类型的媒体文件。

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAIAAAACUFjqAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9EFBAoYMhVvMQIAAAAtSURBVHicY/z//z8DHoBH+v///yy4FDEyMjIwMDDhM3lgpaEuh7gTEzDiDxYA9HEPDF90e5YAAAAASUVORK5CYII=">

使用CSS样式表时,可以使用JavaScript完全创建这些过程。


当然base64会占用更多空间,使文件大小增加三倍……
Tobias Kienzler 2014年

10
@TobiasKienzler:64 * 4 = 256并不意味着编码一个字节要花费4倍的数据,而是每个字节中只有8位使用6位(2 ** 6 = 64)。这意味着编码3个字节需要4个字节,这使大小增加了33%(必要时不计算填充)。几乎没有四倍。数据大小加倍的唯一情况是对单个字节进行编码时,这需要2个数据字节和2个填充字节。
熊猫睡衣2014年

2
@PandaPajama我不好,我想说的是“增加四分之一”(由于2/8 = 1/4的浪费位)。尽管很明显我还是在那儿犯了一个错误,但您得出的33%是正确的。仍然是电子邮件附件的开销,也是“著名的”
Tobias Kienzler 2014年

1
基于64的内联编码是否可以用于其他资源,例如.wav,.ogg,.m4a,以及通常的任何文件?
DrZ214 '16

1
@ DrZ214我还没有尝试过,但是AFAIK它应该可以在URL工作的任何地方工作。
菲利普

31

仅将所有文件放入.zip文件中不是可行的解决方案,因为大多数Web应用程序都需要Web服务器,以便它们可以通过HTTP请求访问资源。在某些系统上,您可以通过file://URI方案访问文件,但是由于安全原因,不能保证该文件在任何地方都能正常工作,并且会因AJAX请求等原因而失败。

它可能适用于一个非常简单的应用程序,在该应用程序中您拥有最多的内联资源,但这确实不是我向所有人推荐的方法。但是,还有其他选择,例如:

生成本机应用程序

您可以使用Node-Webkit将Web应用程序打包为本地应用程序。您甚至可以使用它向游戏添加本机桌面功能(例如本地保存游戏)。

不过,这不是“ 打包完成 ”的方法。您可能必须重写应用程序的一部分并编写不同的加载程序(例如,对于台式机应用程序,您宁愿通过文件系统加载文件,而使用HTTP -浏览器/在线游戏中的请求)。

使用HTML5功能允许离线访问您的应用

如果您的主要目标是允许玩家离线玩游戏,那么您也可以使用应用程序缓存来允许离线访问您的应用程序。这是在大多数现代浏览器中均可使用的功能。额外的好处是,用户无需下载任何内容,即使离线也可以使用书签来玩游戏。

对于异步加载(AJAX)的资源,您还必须实现单独的加载机制。您可以利用本地存储来保存这些资源以供脱机使用。


2
Node-Webkit非常大,如果包含它,最终将为“ hello world” JS游戏提供60MB的内存。
ashes999

1
如果您的应用程序非常复杂,这是正确的答案。
沃恩击中了2014年

1
@ ashes999我同意你的观点,但是对于如今的桌面应用程序而言,60MB仍然很小。许多通用框架会产生一些文件大小的开销(以Unity为例)。随着存储空间的不断增加,便利性胜过文件大小;)
bummzack 2014年

2
@bummzack我不同意。在添加任何艺术或音频之前,令人沮丧的是,制作了一个约100kb的JS游戏,并使其变成60MB。希望有人会提出更好的方法。+1 btw
ashes999 2014年

1
尽管此答案中有很多有用的信息,但引言是完全错误的。您可以将游戏数据放在JavaScript文件中,现代的浏览器应该至少能够处理几MB的JavaScript,并且只要您不尝试从画布上读取图像数据,使用图像文件也没有错。上次我检查时,所有现代浏览器都允许该file:///协议访问localStorage,以进行保存。它可以扩展为HTML游戏中除在线游戏之外可以做的任何事情。
aaaaaaaaaaaaaa

7

要使基于Chrome的解决方案能够离线运行游戏并享受某些本机功能,可以考虑制作Chrome应用

这样,您可以将其分发到Chrome Web Store中以提高可见性,可以使用一些强大的API,并使它看起来更像一个独立的应用程序

缺点当然是需要Chrome。


1
Firefox(和Firefos OS)具有OpenWebApps(developer.mozilla.org/en/Apps/Quickstart/Build/…),类似于:Web应用程序ID是作为应用程序安装而下载的。两种解决方案都应遵循一个共同的标准:html5doctor.com/web-manifest-specification。另请参见:code.google.com/p/chromium/issues/detail?
id=366145

@ysdx您提到的融合标准是Chrome所谓的“托管应用程序”,而不是真正的独立,可下载的应用程序,也称为“打包的应用程序”。Firefox也使用相同的术语。不幸的是,打包的应用程序在架构上有很大的不同,不可能融合。
2014年

@Xan什么是打包的应用程序?Firefox和Chrome应用商店中是否提供“托管”和“打包”应用?
Qsigma 2014年

1
@Qsigma打包的应用程序是大多数独立的HTML5应用程序,可以访问强大的API,例如本地文件系统访问权限;之所以“打包”,是因为它在下载中包含了自己的资源。“托管”应用程序基本上是指向带有某些元数据的网站的链接。将其视为快捷方式和书签之间的交叉。我说不清Firefox商店,但是第一个注释中的文档描述了如何编写打包的应用程序。
2014年

单击并让应用程序脱机运行而无需进一步下载并具有更多配额和权限,以及单击并使应用程序脱机而无需进一步下载而具有更多配额和权限之间有什么区别?尽管从技术上讲它们之间存在差异,但这些差异是肤浅的,对用户而言没有差异。打包正确设计的托管应用程序应该很简单,而且要有正确的清单。打包应用程序的缺点是,没有外部包管理器就无法更新自身,而托管应用程序的浏览器本身就是包管理器。
Lie Ryan 2014年

0

好吧,这取决于您真正想要投入多少工作。使用当前的一组Web API,您可以:

  • 创建一个渐进式Web应用程序(PWA) (可悲的是个PWA仅适用于手机和Chrome OS,但我听说过Chrome浏览器桌面很快就会有很快的支持。现在,它隐藏着一个标志后面),因为旧的应用缓存现已弃用
  • 所有内容转换文本图像音频)。并鼓励用户按原样保存网页(使用Cmd+SCtrl+S在浏览器中)或将网页缓存为PWA。只是知道,在移动设备上,dataURI的性能不是很好。
  • 您可以创建一个Chrome应用程序,但是不能在没有在Chrome操作系统上运行的任何Chrome版本上运行。这意味着它是更好地为您创建一个扩展,而不是
  • 大多数游戏的内存不足10 MB,也就是说您可以将所有游戏数据缓存到本地存储中。如何执行此操作取决于您:您可以执行上述操作(将所有内容转换为文本),使用Blob api等。尽管我不鼓励这样做,因为某些手机可以从内存中清除整个游戏。这意味着您必须检查一切正常(如果代码仍在内存中),这意味着更长的加载时间,还可能使用户电话崩溃。如果您确实选择走这条路,那么使用LocalForage绝对可以使您受益
  • 使用ElectronNW.js,您可以使用html,css和js创建桌面应用程序。也可以使用类似的方法来创建移动应用程序(使用诸如Cordova之类的东西或诸如PhoneGap之类的Cordova依赖项)。您可以这样做,并允许用户下载完整的游戏。
  • 如果仍然要继续处理zip文件,请签出JSZip。我不知道如何使用它,但是我确定有人可以提出一个好主意(也许压缩文件,然后将二进制数据转换为字符串并将其内联到html中)。
  • 这种怪异的hack允许您将任何文本数据加载为数据块。这只是您可以用来将资产嵌入到html文件中的另一个工具。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.