【发布时间】:2017-02-15 18:31:59
【问题描述】:
短版:
我们如何处理最终输出包的 AST,以及加载器内部文件的 AST?在这两种情况下,我都想操纵现有的 AST,而不是我正在做的事情是解析源代码并创建一个新的 AST。我做的很慢,而且我知道 Webpack 肯定已经做了 AST,所以我想避免重复工作。
加长版:
例如,假设我有一堆文件,其格式类似于(但不完全是)AMD 模块:
module({
Foo: '/path/to/Foo',
Bar: '/path/to/Bar',
Baz: '/path/to/Baz',
}, function(imports) {
console.log(imports) // {Foo:..., Bar:... Baz:...}
})
不同之处在于它被称为module而不是define,dependencies参数是导入名称到模块路径的映射而不是模块路径数组,模块主体函数接收import对象所有请求的导入,而不是每个请求的导入一个参数。
上面和下面AMD格式的类似,输出一样:
define([
'/path/to/Foo',
'/path/to/Bar',
'/path/to/Baz',
], function(Foo, Bar, Baz) {
console.log({Foo, Bar, Baz}) // {Foo:..., Bar:... Baz:...}
})
什么是挂钩到 Webpack 以使 Webpack 能够理解文件(能够知道文件具有哪些依赖项)以最终构建包含以 module() 格式编写的文件的包的推荐方法是什么?
我已经尝试过一种方法:我制作了一个自定义加载器,它以字符串的形式接收文件的源,解析它并创建和 AST,转换 AST,然后以 Webpack 理解的 AMD define() 格式输出代码.
但是,我觉得这很慢,因为如果有很多文件并且它们很大,那么从每个文件解析和制作 AST 似乎是多余的,因为我敢打赌 Webpack 已经开始这样做了。有没有办法从 Webpack 获取 AST 并在 Webpack 扫描它的依赖项之前对其进行转换,以便我可以将 AST 转换为 AMD 格式(或任何可识别的格式),以便 Webpack 最终可以使用该文件?还有其他方法吗?
【问题讨论】:
标签: javascript node.js webpack