はじめに
django-webpack-loader + vue-cli の構成で、起動から Heroku での公開までを試した際の備忘録です。
django-webpack-loader
の django 側の設定は基本的には README.md#configuration に書いてある通りなんですが、webpack 側は webpack.config.js
での設定しかありません。
この記事では vue-cli
で動作させるために vue.config.js
の設定を紹介します。
バージョン
$ python --version
Python 3.7.11
$ vue --version
@vue/cli 4.5.13
Django = "^3.2.4"
django-webpack-loader = "^1.1.0"
"vue": "^3.0.0"
"webpack-bundle-tracker": "^1.1.0"
最小限の設定
var BundleTracker = require('webpack-bundle-tracker');
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '/static/dist/'
: 'http://localhost:8080/',
outputDir: 'static/dist',
configureWebpack: {
plugins: [
new BundleTracker({filename: './webpack-stats.json'}),
],
},
css: {
sourceMap: true,
},
devServer: {
headers: {
'Access-Control-Allow-Origin': '*',
},
},
}
項目別の説明
publicPath
publicPath: process.env.NODE_ENV === 'production'
? '/static/dist/'
: 'http://localhost:8080/'
本番以外は http://localhost:8080/
になります。
localhost:8080
は devServer のデフォルトです。
なぜ '/' じゃダメなのか
publicPath
で HOST:PORT を省略すると、django の静的ファイルへの URL が 以下のようになります。
http://localhost:8000/<file>
localhost:8000
は runserver のデフォルトです。
つまり django 側からファイルを探そうとします。
開発中は build
で静的ファイルを生成する訳ではないので、 vue の devServer にファイルを取りにいく必要があります。そのため設定値は http://localhost:8080/
となります。
outputDir
outputDir: 'static/dist'
django 側で settings.STATICFILES_DIRS
に指定したディレクトリ下の値にします。
今回は settings.STATICFILES_DIRS=['static']
を指定しておいたので、
yarn build
では static/
下に dist
として出力されるようにしました。
configureWebpack
configureWebpack: {
plugins: [
new BundleTracker({filename: './webpack-stats.json'}),
],
}
django-webpack-loader
は webpack-bundle-tracker
と一緒に使うことになります。
ここはその設定です。
django 側の settings.WEBPACK_LOADER["default"]["STATS_FILE"]
で参照するファイルをどこに出力するかを指定します。
css.sourceMap
css: {
sourceMap: true,
}
django-webpack-loader
が filename.css.map
を探そうとするのですが、vue-cli
ではデフォルトが無効になっているので、そのままだとエラーになってしまいます。
devServer.headers
devServer: {
headers: {
'Access-Control-Allow-Origin': '*',
},
}
ホットリロードを有効にするために必要です。
vue 側のソースコードに変更があった場合 localhost:8000(django)
から localhost:8080(vue)
の hot-update.json
にアクセスしようとするのですが、その際に CORS にひっかかります。それを回避するために devServer では 'Access-Control-Allow-Origin': '*'
を指定しています。
さいごに
今回の試したソースコードを載せておきます。
あくまで django-webpack-loader + vue-cli
のお試しなので、django/vue のプロジェクトは生成しただけになってます。