webpack/lib/dependencies/CommonJsPlugin.js

162 lines
5.1 KiB
JavaScript
Raw Normal View History

2013-01-31 01:49:25 +08:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
2018-07-30 23:08:51 +08:00
"use strict";
2018-07-30 23:08:51 +08:00
const CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
2018-07-30 23:08:51 +08:00
const CommonJsRequireDependency = require("./CommonJsRequireDependency");
const ConstDependency = require("./ConstDependency");
const RequireHeaderDependency = require("./RequireHeaderDependency");
const RequireResolveContextDependency = require("./RequireResolveContextDependency");
2018-07-30 23:08:51 +08:00
const RequireResolveDependency = require("./RequireResolveDependency");
const RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
const CommonJsRequireDependencyParserPlugin = require("./CommonJsRequireDependencyParserPlugin");
2018-07-30 23:08:51 +08:00
const RequireResolveDependencyParserPlugin = require("./RequireResolveDependencyParserPlugin");
2018-11-17 01:18:44 +08:00
const RuntimeGlobals = require("../RuntimeGlobals");
2018-07-03 16:24:29 +08:00
const {
evaluateToIdentifier,
evaluateToString,
toConstantDependency
} = require("../JavascriptParserHelpers");
class CommonJsPlugin {
constructor(options) {
this.options = options;
}
apply(compiler) {
const options = this.options;
2018-02-25 09:00:20 +08:00
compiler.hooks.compilation.tap(
"CommonJsPlugin",
(compilation, { contextModuleFactory, normalModuleFactory }) => {
compilation.dependencyFactories.set(
CommonJsRequireDependency,
normalModuleFactory
);
compilation.dependencyTemplates.set(
CommonJsRequireDependency,
new CommonJsRequireDependency.Template()
);
2018-02-25 09:00:20 +08:00
compilation.dependencyFactories.set(
CommonJsRequireContextDependency,
contextModuleFactory
);
compilation.dependencyTemplates.set(
CommonJsRequireContextDependency,
new CommonJsRequireContextDependency.Template()
);
2018-02-25 09:00:20 +08:00
compilation.dependencyFactories.set(
RequireResolveDependency,
normalModuleFactory
);
compilation.dependencyTemplates.set(
RequireResolveDependency,
new RequireResolveDependency.Template()
);
2018-02-25 09:00:20 +08:00
compilation.dependencyFactories.set(
RequireResolveContextDependency,
contextModuleFactory
);
compilation.dependencyTemplates.set(
RequireResolveContextDependency,
new RequireResolveContextDependency.Template()
);
2018-02-25 09:00:20 +08:00
compilation.dependencyTemplates.set(
RequireResolveHeaderDependency,
new RequireResolveHeaderDependency.Template()
);
2018-02-25 09:00:20 +08:00
compilation.dependencyTemplates.set(
RequireHeaderDependency,
new RequireHeaderDependency.Template()
);
2018-02-25 09:00:20 +08:00
const handler = (parser, parserOptions) => {
2018-08-21 08:26:50 +08:00
if (parserOptions.commonjs !== undefined && !parserOptions.commonjs)
2018-02-25 09:00:20 +08:00
return;
const tapRequireExpression = (expression, getMembers) => {
2018-02-25 09:00:20 +08:00
parser.hooks.typeof
.for(expression)
.tap(
"CommonJsPlugin",
2018-07-03 16:24:29 +08:00
toConstantDependency(parser, JSON.stringify("function"))
2018-02-25 09:00:20 +08:00
);
parser.hooks.evaluateTypeof
.for(expression)
2018-07-03 16:24:29 +08:00
.tap("CommonJsPlugin", evaluateToString("function"));
2018-02-25 09:00:20 +08:00
parser.hooks.evaluateIdentifier
.for(expression)
.tap(
"CommonJsPlugin",
evaluateToIdentifier(expression, "require", getMembers, true)
);
};
tapRequireExpression("require", () => []);
tapRequireExpression("require.resolve", () => ["resolve"]);
tapRequireExpression("require.resolveWeak", () => ["resolveWeak"]);
2018-02-25 09:00:20 +08:00
parser.hooks.evaluateTypeof
.for("module")
2018-07-03 16:24:29 +08:00
.tap("CommonJsPlugin", evaluateToString("object"));
2018-11-17 01:18:44 +08:00
parser.hooks.expression.for("exports").tap("CommonJsPlugin", expr => {
const module = parser.state.module;
const isHarmony = module.buildMeta && module.buildMeta.exportsType;
if (!isHarmony) {
return toConstantDependency(parser, module.exportsArgument, [
RuntimeGlobals.exports
])(expr);
}
});
2018-02-25 09:00:20 +08:00
parser.hooks.assign.for("require").tap("CommonJsPlugin", expr => {
// to not leak to global "require", we need to define a local require here.
const dep = new ConstDependency("var require;", 0);
dep.loc = expr.loc;
parser.state.current.addDependency(dep);
return true;
});
parser.hooks.canRename
.for("require")
.tap("CommonJsPlugin", () => true);
parser.hooks.rename.for("require").tap("CommonJsPlugin", expr => {
// To avoid "not defined" error, replace the value with undefined
const dep = new ConstDependency("undefined", expr.range);
2018-02-25 09:00:20 +08:00
dep.loc = expr.loc;
parser.state.current.addDependency(dep);
return false;
});
2018-11-17 01:18:44 +08:00
parser.hooks.typeof
.for("module")
.tap(
"CommonJsPlugin",
toConstantDependency(parser, JSON.stringify("object"))
);
2018-02-25 09:00:20 +08:00
parser.hooks.evaluateTypeof
.for("exports")
2018-07-03 16:24:29 +08:00
.tap("CommonJsPlugin", evaluateToString("object"));
2018-02-25 09:00:20 +08:00
new CommonJsRequireDependencyParserPlugin(options).apply(parser);
new RequireResolveDependencyParserPlugin(options).apply(parser);
};
2018-02-25 09:00:20 +08:00
normalModuleFactory.hooks.parser
.for("javascript/auto")
.tap("CommonJsPlugin", handler);
normalModuleFactory.hooks.parser
.for("javascript/dynamic")
.tap("CommonJsPlugin", handler);
}
);
}
}
module.exports = CommonJsPlugin;