尝试要求未安装但不必要的模块时发出警告

Sha*_*oux 5 javascript require webpack

我试图在文件中要求仅在模块实际可用时才使用的模块。因此该模块是完全可选的。此代码将作为第三方库的一部分分发。问题是,如果使用,任何使用webpack的用户都将看到其构建失败import,因此我最终使用了:

let webrtc = {};
try {
  webrtc = require('my-optional-module');
} catch (err) {}
Run Code Online (Sandbox Code Playgroud)

但是,即使有了此代码,它们也会在不需要此可选模块的项目上得到警告:

[WEB] WARNING in ./node_modules/xxx
[WEB] Module not found: Error: Can't resolve 'my-optional-module' in '/Users/xxx/node_modules/xxx'
Run Code Online (Sandbox Code Playgroud)

编辑:使用下面的答案

let webrtc = {};
if(require.resolve('my-optional-module')) {
  webrtc = require('my-optional-module');
}
Run Code Online (Sandbox Code Playgroud)

但是我得到这个警告:

Critical dependency: the request of a dependency is an expression
Run Code Online (Sandbox Code Playgroud)

而这个错误:

Module not found: Error: Can't resolve 'my-optional-module' in xxx
Run Code Online (Sandbox Code Playgroud)

编辑2:

基于webpack指令进行动态导入,我还尝试了:

var webrtc = {};
require.ensure(['my-optional-module'], function (require) {
  return webrtc = require('my-optional-module');
});
Run Code Online (Sandbox Code Playgroud)

但是我仍然得到:

Module not found: Error: Can't resolve 'my-optional-module' in xxx
Run Code Online (Sandbox Code Playgroud)

Pat*_*rts 2

看来这是 webpack 中的一个常见问题。根据配置文档module: { exprContextCritical: false },您可以使用您的标志webpack.config.js在整个项目中全局抑制此警告,尽管该标志被认为已弃用,并且您可能会在我链接的问题中找到更强烈推荐的解决方案。