动态 require js module

2020-01-17 14:55:24 +08:00
 zivyou

有一个需求,是去判断一个目录下面有没有 js 文件,如果有的话,就 require 它(后续肯定会用到这些 js 文件里面的一些函数)。 现在我的写法是:

const files = readdirSync(path);
const jsFiles = files.filter((f) => f.endsWith('.js'));

jsFiles.forEach((f) => {
    const jsFile = `${path}/${f}`;
    const mapping = require(jsFile);
   // do something with mapping
});

eslint 会提示 dynamic require 是一种不好的设计,查了一些资料,也有明确说不能动态 require js 文件的。 请问下各位老哥,这种情况有什么更好的方案吗?

PS: 目前为止这段代码运行还没有带来什么问题

5972 次点击
所在节点    Node.js
3 条回复
libook
2020-01-17 15:07:22 +08:00
运行肯定是可以运行的,功能也能满足要求,ESLint 规则只是建议,并不一定代表程序一定有问题。

动态 require 的问题可能有:
1. 如果你用 Webpack 等打包工具分析代码依赖的时候,无法妥善处理动态 require 的代码,只能处理静态引用。
2. 如果引用的文件有被替换或篡改的可能性(如上传功能),或如果引用的路径有被篡改的可能性,那么在文件第一次被 require 之前,可能会被攻击,并最终导致运行恶意代码。

暂时想到的只有这么多,如果你的使用场景不具备以上风险的前提条件,就可以用。
zivyou
2020-01-17 15:36:57 +08:00
@libook 感谢
xcstream
2020-01-18 04:20:26 +08:00
可以先扫描一下目录 写出一个 js 文件里面都是 require, 再 require 它

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

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

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

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

© 2021 V2EX