fix: patch vue-loader for hmr

This commit is contained in:
Igor Randjelovic
2021-03-12 16:08:28 +01:00
parent 6cc0ce3d57
commit 3a28f9eef6

View File

@ -1,9 +1,11 @@
import { VueLoaderPlugin } from 'vue-loader'; import { VueLoaderPlugin } from 'vue-loader';
import { merge } from 'webpack-merge'; import { merge } from 'webpack-merge';
import Config from 'webpack-chain'; import Config from 'webpack-chain';
import fs from 'fs';
import { getPlatformName } from '../helpers/platform'; import { getPlatformName } from '../helpers/platform';
import { env as _env, IWebpackEnv } from '../index'; import { env as _env, IWebpackEnv } from '../index';
import { error } from "../helpers/log";
import base from './base'; import base from './base';
export default function (config: Config, env: IWebpackEnv = _env): Config { export default function (config: Config, env: IWebpackEnv = _env): Config {
@ -11,6 +13,11 @@ export default function (config: Config, env: IWebpackEnv = _env): Config {
const platform = getPlatformName(); const platform = getPlatformName();
// we need to patch VueLoader if we want to enable hmr
if(env.hmr) {
patchVueLoaderForHMR()
}
// resolve .vue files // resolve .vue files
// the order is reversed because we are using prepend! // the order is reversed because we are using prepend!
config.resolve.extensions.prepend('.vue').prepend(`.${platform}.vue`); config.resolve.extensions.prepend('.vue').prepend(`.${platform}.vue`);
@ -65,3 +72,19 @@ export default function (config: Config, env: IWebpackEnv = _env): Config {
return config; return config;
} }
/**
* Patches source of vue-loader to set the isServer flag to false
* so hmr gets enabled.
*/
function patchVueLoaderForHMR() {
try {
const vueLoaderPath = require.resolve('vue-loader/lib/index.js')
const source = fs.readFileSync(vueLoaderPath).toString();
const patchedSource = source.replace(/(isServer\s=\s)(target\s===\s'node')/g, '$1false;')
fs.writeFileSync(vueLoaderPath, patchedSource)
delete require.cache[vueLoaderPath]
} catch (err) {
error('Failed to patch VueLoader - HMR may not work properly!')
}
}