如何编写一个插件,用字符串结果替换任何函数执行

时间:2016-06-03 17:59:16

标签: webpack webpack-plugin

我有一个插件:

var Foo = function() {};

function lookup(key) {
    // pretend this lookup function returns a different value based on key input
    return 'something else';
}

Foo.prototype.apply = function() {
    compiler.plugin('compilation', function(compilation, params) {
        compilation.dependencyFactories.set(ConstDependency, new NullFactory());
        compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
    });

    compiler.parser.plugin('call abc.bar', function(expr) {
        var param = this.evaluateExpression(expr.arguments[0]);
        var result = lookup(param.string);
        var dep = new ConstDependency(JSON.stringify(result), expr.range);
        dep.loc = expr.loc;
        this.state.current.addDependency(dep);
        return true;
    });
};

- >当我对这个文件运行时:

var someString = abc.bar('something');

- >它被编译并替换为:

var someString = 'something else';

- >但是当我这样做时:

var abc = require('abc');
var someString = abc.bar('something');

- >它被编译为:

var abc = webpack_require(123);
var someString = abc.bar('something');

当你有一个局部变量时,发生了什么以及为什么编译器的行为会有所不同?

我该怎么做才能让替换仍然发生?

如果函数调用位于对象声明中,我也看到它被忽略了:

var someObj = { someKey: abc.bar('something'); }

0 个答案:

没有答案