JavaScript >> Javascript 文檔 >  >> JavaScript

將靜態文件部署到 Heroku

如果您在相同的域上使用 Ruby on Rails、Django 或 NodeJS 框架,它們有特殊的文件夾,通常稱為 static , 公開資產 .但是,如果您只部署通常不是那麼靜態的“靜態”文件呢?順便說一句。

Heroku 使用 Cedar 堆棧作為應用程序創建工具,它不支持靜態文件的平面部署,例如 HTML、CSS 或 JavaScript,除非它們帶有一些服務器端語言,例如 PHP、Ruby、Python。如果您使用使用 jQuery 或 BackboneJS 框架和服務(如 Parse.com 或 Firebase.com)構建的前端應用程序,或者使用您自己的後端部署為不同實例和/或域上的不同應用程序,這可能會派上用場。

有多種方法可以誘使 Heroku 和 Cedar 認為您的 HTML、CSS 和 JavaScript 文件是 PHP 或 Ruby on Rails 或任何其他合法的 Cedar 堆棧應用程序。這裡最簡單的方法是創建index.php 項目文件夾中的文件,與 .git 處於同一級別 文件夾。您可以使用以下命令在終端中執行此操作:

$ touch index.php

然後我們用 .htaccess 關閉 PHP 指示。您可以將行添加到 .htaccess 並使用此終端命令創建它:

$ echo 'php_flag engine off' > .htaccess

這兩個終端命令將創建空 index.php 文件和 .htaccess 關閉 PHP 的文件。這個解決方案是由 Kenneth Reitz 發現的。

另一種方法不太優雅,但也涉及 PHP。在要發布/部署到 Heroku 的項目文件夾中創建與 index.html 相同級別的文件 index.php,內容如下:

<?php echo file_get_contents('index.html'); ?>

第三種方式是使用 Ruby 和 Ruby Bamboo 堆棧。在這種情況下,我們需要以下結構:

 -project folder
    config.ru
   /public
      index.html
      /css
      app.js
      ...

index.html 中 CSS 和其他資源的路徑應該是相對的。即'css/style.css'。 config.ru 文件應包含以下代碼:

use Rack::Static, 
  :urls => ["/stylesheets", "/images"],
  :root => "public"

run lambda { |env|
  [
    200, 
    {
      'Content-Type'  => 'text/html', 
      'Cache-Control' => 'public, max-age=86400' 
    },
    File.open('public/index.html', File::RDONLY)
  ]
}

有關詳細信息,您可以參考 Bamboo Heroku 官方文檔。

最後但同樣重要的是,對於 Python 和 Django 開發人員,您可以將以下內容添加到您的 urls.py

urlpatterns += patterns(”, (r’^static/(?P.*)$’, ‘django.views.static.serve’, {‘document_root’: settings.STATIC_ROOT}),)

或者使用這個 Procfile 行:

web: python my_django_app/manage.py collectstatic --noinput; bin/gunicorn_django --workers=4 --bind=0.0.0.0:$PORT my_django_app/settings.py 

完整的 Django 帖子位於在 Heroku 上管理 Django 靜態文件。

如果你使用 NodeJS,下面是如何編寫自己的服務器:

var http = require("http"),
url = require("url"),
path = require("path"),
fs = require("fs")
port = process.argv[2] || 8888;

http.createServer(function(request, response) {

  var uri = url.parse(request.url).pathname
    , filename = path.join(process.cwd(), uri);

  path.exists(filename, function(exists) {
    if(!exists) {
      response.writeHead(404, {"Content-Type": "text/plain"});
      response.write("404 Not Found\n");
      response.end();
      return;
    }

    if (fs.statSync(filename).isDirectory()) filename += '/index.html';

    fs.readFile(filename, "binary", function(err, file) {
      if(err) {        
        response.writeHead(500, {"Content-Type": "text/plain"});
        response.write(err + "\n");
        response.end();
        return;
      }

      response.writeHead(200);
      response.write(file, "binary");
      response.end();
    });
  });
}).listen(parseInt(port, 10));

console.log("Static file server running at\n  => http://localhost:" + port + "/\nCTRL + C to shutdown");

Tutorial JavaScript 教程
  1. 如何使用 Nuxt.js 和 Nexmo SMS API 發送和接收 SMS 消息

  2. 使用 NgRx 在 Angular 中實現 Auth0 - iFour Technolab

  3. 如何使用 Node JS 創建 Todo CLI 應用程序。

  4. ES5/ES6 中的作用域、閉包、循環:不完整的方法目錄

  5. 如何成為一個更好的反應開發者。

  6. 沒有 src 屬性的 iframe

  7. 如何創建 Google Chrome 擴展程序

  1. 串行執行與同時執行的 async/await JavaScript 函數數組

  2. HTML5 遊戲的 Web 字體預加載

  3. 飛揚的小鳥遊戲| 高分辨率照片| CLIPARTO javascipt |畫布 |html |css

  4. HTML5 和 jQuery 超級簡單的下拉導航

  5. 如何在 HTML 中訪問 formArray 的屬性?

  6. 2020 年 13 個最佳 JavaScript 框架

  7. VueJS 快速提示:Composition API 中的 Vue-router-next

  1. 只需一分鐘即可從 Javascript 獲取推送通知!

  2. 在 React 中創建圖表變得更加容易

  3. 試圖預測天氣:我慢慢陷入與實施相關的瘋狂

  4. 使用 React Query 構建類似 Instagram 的無限滾動提要