menu
書いてる野郎
orebike@gmail.com
画面が1個しか無いなら entry は1つでいいかもしれない。 entry が一つということは出力も一つということである。
しかし、それでは関係ない機能や画面ごと固有の動きに対応できない。 なので複数の entry が欲しい場合がある。 複数の entry があるということは出来上がる出力も複数あるということである。
それには splitChunks という機能を使うことになるようだ。
※↑のように書いたが、よくよく考えれば webpack.config.js をたくさん用意したほうがスマートだと思う。
このようなファイル
<template> <div>{{ say }}</div> </template> <script> export default { data: function(){ return { say: "HelloHoge" }; } } </script>
ほぼ全部同じで return 部分だけ違うファイルを
と用意する。Moge.vue は共通依存という位置づけ
中の依存性はファイルごとに違う。
import Vue from "vue" import Hoge from "./Hoge.vue" import Moge from "./Moge.vue" document.addEventListener("DOMContentLoaded", () => { new Vue({ el: "#app1", render: a => a(Hoge) }); new Vue({ el: "#app2", render: a => a(Moge) }); });
このような感じ app1 側が違っていて app2 は全部同じな entry を
と作る。
splitChunks を使うように記述する。
const VueLoaderPlugin = require('vue-loader/lib/plugin') const path = require('path'); module.exports = { entry: { hoge: "./src/hoge.js", piyo: "./src/piyo.js", fuga: "./src/fuga.js" }, output: { filename: '[name].bundle.js', path: path.join(__dirname, 'dist') }, optimization: { splitChunks: { name: 'vendor', chunks: 'initial' } }, module: { rules:[{ test: /\.vue$/, loader: "vue-loader" }] }, plugins: [ new VueLoaderPlugin() ] };
entry をキー付きで3つ指定している。
output 指定する。 filename の部分の [name]
は entry のキーと対応していて
というファイルを生成する指定となる。path はそのままで出力ディレクトリ
共通部分である moge はどこに行くかと言うと、splitChunks の指定で、vendor
となっているので、
``vendor.bundle.js`` となる。chunks は分割部分をどう読み込むかの指定だが initial で静的に読み込む。
これができればビルドする。
それぞれを読み込む
を作る。 ここは webpack とは無関係である。 想定としてはこのhtmlの生成を Spring Boot の Thymeleaf に任せる。
内容はこんな感じで script のとこだけちょっとずつ違うやつを作る
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>hoge</title> <script src="vendor.bundle.js"></script> <script src="hoge.bundle.js"></script> </head> <body> <div id="app1"></div> <div id="app2"></div> </body> </html>
そしてブラウザで開いて
HelloHoge HelloMoge
HelloPiyo HelloMoge
HelloFuga HelloMoge
と表示されれば OK