在Rails 4中放置Web worker文件的位置?

时间:2014-12-29 23:02:05

标签: ruby-on-rails-4 asset-pipeline

HTML5 Web Workers通常使用importScripts()依赖外部脚本。这些脚本应该放在Rails 4的哪个位置,以便它们按照资产管道正常缩小,但仍能正常工作?

使用需要解决的资产管道时存在一些问题:

  1. 默认情况下,外部脚本(如果放在vendor/assets下)不会由资产管道处理(在Rails 3中不是这种情况)。
  2. 如果脚本位于app/assets下,则需要将它们包含在application.js中才能进行处理。但是,工作文件不应包含在组合输出中(即application-[digest].js)。
  3. 如果脚本包含在资产配置中,则生成的文件将在其文件名中包含摘要。要加载工作者,需要向浏览器提供其路径(例如new Worker('myWorker.js')。我们如何找到路径?(我尝试了asset_path,但它没有用。)
  4. 就像3中一样,工作人员在调用importScripts()时需要按名称引用其他文件。我们如何找到加载的路径?

2 个答案:

答案 0 :(得分:3)

对于来自Google的所有人 - 您都可以使用Inline Workers

内联员工

如果要动态创建工作脚本,或创建自包含页面而不必创建单独的工作文件,该怎么办?使用Blob(),您可以"内联"通过以字符串形式创建工作程序代码的URL句柄,将您的工作者放在与主逻辑相同的HTML文件中:

var blob = new Blob([
    "onmessage = function(e) { postMessage('msg from worker'); }"]);

// Obtain a blob URL reference to our worker 'file'.
var blobURL = window.URL.createObjectURL(blob);

var worker = new Worker(blobURL);
worker.onmessage = function(e) {
  // e.data == 'msg from worker'
};
worker.postMessage(); // Start the worker.

答案 1 :(得分:0)

根据惯例(不太受欢迎),它应该转到vendor/assets。确切地说:

  • app/严格限制在此特定应用中的所有内容
  • lib/所有由您编写但未绑定到您的应用程序的代码(可以或将被提取到单独的gem)
  • vendor/所有第三方代码