在Django中使用Webpack:再也不需要插件了

在Django中使用Webpack:再也不需要插件了

這篇文章將會學習如何在Django中以最小的代價安裝Webpack。這個問題常規的解決辦法是使用django-webpack-loader,但是在我看來這種方式代價太大。這篇文章的目的是提供一個在Django中安裝設置Webpack的手冊,只使用Webpack和Django的功能而不使用任何插件。

Django-webpack-loader

django-webpack-loader 看起來是在Django項目中安裝Webpack的事實上的解決辦法。我嘗試使用它但是這個方法的效果並不好:

  1. 它需要一個非標準的manifest插件(這看起來也很奇怪)。

  2. 它提供了一組定製Django模板的工具,而不是使用Django優秀的內置static功能。

  3. 為了使用這些定製工具,需要在Django中做一堆配置。

它是一個很不方便的解決方案,既需要Webpack插件也需要Django插件。

免責聲明:儘管我在這裡批評了Django-webpack-loader,這並不意味著我否認它的作者在這項工作中付出的艱苦的努力。

普通 Django和Webpack

在Django中使用Webpack實際上相當簡單,並不需要任何Webpack或者Django插件。

Django原生支持處理靜態資源。在開發過程中,Django可以提供靜態資源,並且在生產部署過程中,Django可以壓縮文件和對文件名進行哈希。Webpack也可以做這些(甚至更多),但最方便的是讓Webpack只負責生成資源,讓Django只負責處理資源。

在實踐中,像這樣做:

1. 使用Django默認的對靜態資源的支持

從Django文檔中可以看到,重要的設置如下:

  • <code>STATICFILES_DIRS/<code>

  • <code>STATIC_URL/<code>

  • <code>STATICFILES_STORAGE/<code>- 使用<code>ManifestStaticFilesStorage/<code>讓Django通過對文件名哈希來實現緩存.

2. 配置Webpack寫入文件到STATICFILES_DIRS變量的目錄

你可以使用任何你想使用的Webpack配置項。不過只有一部分重要的配置項:

1. 通過STATICFILES_DIRS變量配置Webpack寫入文件的目錄

2. 配置output.publicPath變量與Django的STATIC_URL匹配

3. 不讓Webpack哈希文件名(除了文件塊,參考下文)

4. 確保webpack-dev-server寫入文件到磁盤(這樣Django可以在部署時提供服務)

在Django中使用Webpack:再也不需要插件了

現在,在開發過程中你需要同時運行webpack-dev-server和Django服務器。你可以使用程序文件和一個類似Goreman的工具來方便地完成這件事而不需要打開兩個終端。Webpack寫文件到STATICFILES_DIRS變量指向的目錄,Django使用這些文件提供服務。最棒的是:你仍然能夠獲得Webback的優勢,像熱加載和動態導入。

你可以使用Django的static標籤來包含Webpack生成的資源:

在Django中使用Webpack:再也不需要插件了

對於生成部署,你首先需要用Webpack構建資源,然後像通常那樣使用manage.py collectstatic命令。太方便快捷了!只有簡單的Django和Webpack,優雅又簡單。

Webpack 文件塊(動態導入)

像我們前面提到的那樣,使用Webpack哈希塊文件名。Webpack運行過程中默認使用塊編號來指向塊文件。當Django運行collectstatic時,它對文件名進行哈希,然後找到沒有哈希的引用進行替換。

例如,如果你在一個樣式表中引用指向了foo.jpg文件,然後Django將foo.jpg重名為foo.695e1b313f34.jpg,它將會自動把樣式表中引用的文件名從foo.jpg修改為foo.695e1b313f34.jpg。

在運行時,Webpack默認通過塊文件的編號chunk id引用它們,因此collectstatic命令不會正確地識別塊文件名。通過使用Webpack哈希塊文件名,我們得到了被恰當哈希的塊文件名,因此這些文件可以被瀏覽器恰當的緩存。

示例項目

對上面內容,我已經在Github上創建了一個演示項目,因此你可以看看實際效果如何。這個項目也可從Heroku獲取。

如果上面的內容對你是有用的,我很想聽到你的反饋!

英文原文:https://pascalw.me/blog/2020/04/19/webpack-django.html
譯者:穆勝亮在Django中使用Webpack:再也不需要插件了


分享到:


相關文章: