From 29df01f16e57a647b41cd7cb91a8a1c93d7ec24e Mon Sep 17 00:00:00 2001 From: Clark Du Date: Sun, 10 Dec 2017 21:54:38 +0800 Subject: [PATCH] fix: memory leak when frequent rebuild in watch mode --- lib/builder/builder.js | 8 ++++++-- lib/builder/webpack/base.config.js | 2 +- lib/builder/webpack/server.config.js | 2 +- lib/common/utils.js | 13 +++++++++++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/builder/builder.js b/lib/builder/builder.js index 4d5e3bdb6d..61c39e3679 100644 --- a/lib/builder/builder.js +++ b/lib/builder/builder.js @@ -9,7 +9,7 @@ import { join, resolve, basename, extname, dirname } from 'path' import MFS from 'memory-fs' import webpackDevMiddleware from 'webpack-dev-middleware' import webpackHotMiddleware from 'webpack-hot-middleware' -import { r, wp, wChunk, createRoutes, sequence, relativeTo, isPureObject, waitFor } from 'utils' +import { r, wp, wChunk, createRoutes, sequence, relativeTo, isPureObject, waitFor, rmCache } from 'utils' import Debug from 'debug' import Glob from 'glob' import clientWebpackConfig from './webpack/client.config.js' @@ -475,7 +475,11 @@ export default class Builder { /* istanbul ignore if */ if (err) return reject(err) // not keep modified or deleted items in Vue.prototype - Object.keys(require.cache).forEach(key => !/\.node$/.test(key) && delete require.cache[key]) + Object.keys(require.cache).forEach(key => { + if (!/(node_modules\/postcss)|(\.node$)/.test(key)) { + rmCache(key) + } + }) }) ) return diff --git a/lib/builder/webpack/base.config.js b/lib/builder/webpack/base.config.js index cf4bf49cdc..b448e94387 100644 --- a/lib/builder/webpack/base.config.js +++ b/lib/builder/webpack/base.config.js @@ -19,7 +19,7 @@ export default function webpackBaseConfig({ name, isServer }) { const config = { name, - devtool: this.options.dev ? 'cheap-module-source-map' : false, + devtool: this.options.dev ? 'cheap-module-eval-source-map' : false, entry: { app: null }, diff --git a/lib/builder/webpack/server.config.js b/lib/builder/webpack/server.config.js index fcdd5bfc8b..eb0f5a5579 100644 --- a/lib/builder/webpack/server.config.js +++ b/lib/builder/webpack/server.config.js @@ -23,7 +23,7 @@ export default function webpackServerConfig() { config = Object.assign(config, { target: 'node', node: false, - devtool: 'source-map', + devtool: this.options.dev ? config.devtool : 'source-map', entry: resolve(this.options.buildDir, 'server.js'), output: Object.assign({}, config.output, { filename: 'server-bundle.js', diff --git a/lib/common/utils.js b/lib/common/utils.js index 20587828df..bd49c0be6b 100644 --- a/lib/common/utils.js +++ b/lib/common/utils.js @@ -268,3 +268,16 @@ export function createRoutes(files, srcDir) { }) return cleanChildrenRoutes(routes) } + +export function rmCache(path) { + const mod = require.cache[path] + delete require.cache[path] + if (mod.parent && mod.parent.children) { + for (let i = 0; i < mod.parent.children.length; i++) { + if (mod.parent.children[i] === mod) { + mod.parent.children.splice(i, 1) + break + } + } + } +}