From a056ac35faf300a4af4102321976861ea0bfe988 Mon Sep 17 00:00:00 2001 From: Haoqun Jiang Date: Thu, 23 Jan 2020 14:08:50 +0800 Subject: [PATCH] refactor: use createRequire to load/resolve modules (#5092) * refactor: use createRequire to resolve modules * fix: use file path as createRequire argument; fix loadModule. --- packages/@vue/cli-shared-utils/lib/module.js | 46 +++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/packages/@vue/cli-shared-utils/lib/module.js b/packages/@vue/cli-shared-utils/lib/module.js index 117b98f3ec..2ef18fa92c 100644 --- a/packages/@vue/cli-shared-utils/lib/module.js +++ b/packages/@vue/cli-shared-utils/lib/module.js @@ -1,18 +1,34 @@ +const Module = require('module') +const path = require('path') + const semver = require('semver') +// https://github.com/benmosher/eslint-plugin-import/pull/1591 +// https://github.com/benmosher/eslint-plugin-import/pull/1602 +// Polyfill Node's `Module.createRequireFromPath` if not present (added in Node v10.12.0) +// Use `Module.createRequire` if available (added in Node v12.2.0) +const createRequire = Module.createRequire || Module.createRequireFromPath || function (filename) { + const mod = new Module(filename, null) + mod.filename = filename + mod.paths = Module._nodeModulePaths(path.dirname(filename)) + + mod._compile(`module.exports = require;`, filename) + + return mod.exports +} + function resolveFallback (request, options) { - const Module = require('module') const isMain = false const fakeParent = new Module('', null) const paths = [] for (let i = 0; i < options.paths.length; i++) { - const path = options.paths[i] - fakeParent.paths = Module._nodeModulePaths(path) + const p = options.paths[i] + fakeParent.paths = Module._nodeModulePaths(p) const lookupPaths = Module._resolveLookupPaths(request, fakeParent, true) - if (!paths.includes(path)) paths.push(path) + if (!paths.includes(p)) paths.push(p) for (let j = 0; j < lookupPaths.length; j++) { if (!paths.includes(lookupPaths[j])) paths.push(lookupPaths[j]) @@ -35,20 +51,26 @@ const resolve = semver.satisfies(process.version, '>=10.0.0') exports.resolveModule = function (request, context) { let resolvedPath try { - resolvedPath = resolve(request, { - paths: [context] - }) + try { + resolvedPath = createRequire(path.resolve(context, 'package.json')).resolve(request) + } catch (e) { + resolvedPath = resolve(request, { paths: [context] }) + } } catch (e) {} return resolvedPath } exports.loadModule = function (request, context, force = false) { - const resolvedPath = exports.resolveModule(request, context) - if (resolvedPath) { - if (force) { - clearRequireCache(resolvedPath) + try { + return createRequire(path.resolve(context, 'package.json'))(request) + } catch (e) { + const resolvedPath = exports.resolveModule(request, context) + if (resolvedPath) { + if (force) { + clearRequireCache(resolvedPath) + } + return require(resolvedPath) } - return require(resolvedPath) } }