Webpack 中如何在引用文件后再次走一遍 loader 的流程?

2020-05-07 16:40:19 +08:00
 Shook

昨天提了个“利用 Webpack 打包 AMD 项目时,因为使用了路径映射导致 webpack 找不到路径”的问题。 有同志建议我用 webpack 的 Externals 解决问题,但经过尝试仍旧达不到目的。 于是今天我尝试在打包时使用搜索并替换文本的 loader,将 js 文件中引用了路径键名的地方替换为真正的路径:

{
	loader: 'string-replace-loader',
	options: {
		search: '(define|require)\\s*\\(\\s*\\[([.\\n]*[^\\[\\]])*\\]',
		replace: function (match) {
			let result = match;

			for (const key in pathConfigPath) {
				if (!pathConfigPath.hasOwnProperty(key)) continue;
				
				result = result.replace(
					new RegExp(`('${key}'|"${key}")`, 'ig'),
					`"${pathConfigPath[key]}"`
				);
				result = result.replace(
					new RegExp(`('text!${key}'|"text!${key}")`, 'ig'),
					`"text!${pathConfigPath[key]}"`
				);
			}
			
			return result;
		},
		flags: 'g',
	}
},

结果转换确实是有一部分成功了:入口文件内使用 require 或者 define 引用的路径键名,被确确实实转换成了真实的路径。 但问题是,入口 A.js 文件引用了 B.js 文件,loader 不会将 B.js 中引用的路径键也转换为真实的路径。 这就导致如果 B.js 文件没有引用的话,可以正常打包; 但如果 B.js 也有自己的引用,webpack 就会找不到路径了,因为 loader 并没有执行到 B.js 。

我该如何解决这个问题呢?

723 次点击
所在节点    问与答
1 条回复
noe132
2020-05-07 18:41:41 +08:00
不知道 NormalModuleReplacementPlugin 是否符合你的需求

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/669343

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX