Webpack - 关键依赖:依赖的请求是一个表达式
Webpack - Critical dependency: the request of a dependency is an expression
我在准系统 webpack 项目中导入 request
时收到三条警告消息。 GitHub(运行 npm install
和 npm start
)上提供了重现错误的最小示例。
Critical dependency: the request of a dependency is an expression
我怎样才能摆脱这个警告?
更多信息:
Webpack 尝试静态解析 require
调用以生成最小的包。当库在 require 调用中使用变量或表达式时(例如 require('' + 'nodent')
in these lines of ajv
),Webpack 无法静态解析它们并导入整个包。
我的理由是这种动态导入在生产环境中是不可取的,代码最好保持无警告。这意味着我想要解决问题的任何解决方案。例如:
- 手动配置 webpack 以导入所需的库并防止出现警告。
- 向我的项目添加一个
hack.js
文件,以某种方式覆盖 require 调用。
- 正在升级我的图书馆。
ajv-5.0.1-beta.3
有一个消除警告的修复程序。但是,如果我要使用它,我必须等到它发布,然后直到 har-validator
和 request
发布后续更新。如果有办法强制 har-validator
使用测试版 ajv
,那将解决我的问题。
- 其他
已解决 npm install request@2.79.0 --save
据 ajv
的作者称,该问题可能会在几周后在最新版本的 request
中得到解决。
替换这个
new webpack.ContextReplacementPlugin(
/angular(\|\/)core(\|\/)@angular/,
helpers.root('./src'), // location of your src
{} // a map of your routes
),
有了这个-
new webpack.ContextReplacementPlugin( /(.+)?angular(\|\/)core(.+)?/, root('./src'), {} )
此警告可以链接到(依赖项或 devDependencies)中的包注入。
如果问题突然出现,请检查您package.json中的最后修改。
如果您打算重新启动 npm install
,请考虑删除软件包-lock.json。
我在 Angular 中无意中从 'protractor' 导入了 EventEmitter 时得到了这个。我怪我的 IDE 竟然提出了这个建议!
应该从核心导入:
import { EventEmitter } from '@angular/core';
我在使用 typeorm 和 nextjs 时遇到了同样的 warnnig。
我通过使用 here
中的代码将其静音
const FilterWarningsPlugin = require('webpack-filter-warnings-plugin');
module.exports = {
...
plugins: [
//ignore the drivers you don't want. This is the complete list of all drivers -- remove the suppressions for drivers you want to use.
new FilterWarningsPlugin({
exclude: [/mongodb/, /mssql/, /mysql/, /mysql2/, /oracledb/, /pg/, /pg-native/, /pg-query-stream/, /react-native-sqlite-storage/, /redis/, /sqlite3/, /sql.js/, /typeorm-aurora-data-api-driver/]
})
]
};
我在上面的排除数组中添加了这样的正则表达式。
/Critical dependency/
我在准系统 webpack 项目中导入 request
时收到三条警告消息。 GitHub(运行 npm install
和 npm start
)上提供了重现错误的最小示例。
Critical dependency: the request of a dependency is an expression
我怎样才能摆脱这个警告?
更多信息:
Webpack 尝试静态解析 require
调用以生成最小的包。当库在 require 调用中使用变量或表达式时(例如 require('' + 'nodent')
in these lines of ajv
),Webpack 无法静态解析它们并导入整个包。
我的理由是这种动态导入在生产环境中是不可取的,代码最好保持无警告。这意味着我想要解决问题的任何解决方案。例如:
- 手动配置 webpack 以导入所需的库并防止出现警告。
- 向我的项目添加一个
hack.js
文件,以某种方式覆盖 require 调用。 - 正在升级我的图书馆。
ajv-5.0.1-beta.3
有一个消除警告的修复程序。但是,如果我要使用它,我必须等到它发布,然后直到har-validator
和request
发布后续更新。如果有办法强制har-validator
使用测试版ajv
,那将解决我的问题。 - 其他
已解决 npm install request@2.79.0 --save
据 ajv
的作者称,该问题可能会在几周后在最新版本的 request
中得到解决。
替换这个
new webpack.ContextReplacementPlugin(
/angular(\|\/)core(\|\/)@angular/,
helpers.root('./src'), // location of your src
{} // a map of your routes
),
有了这个-
new webpack.ContextReplacementPlugin( /(.+)?angular(\|\/)core(.+)?/, root('./src'), {} )
此警告可以链接到(依赖项或 devDependencies)中的包注入。
如果问题突然出现,请检查您package.json中的最后修改。
如果您打算重新启动 npm install
,请考虑删除软件包-lock.json。
我在 Angular 中无意中从 'protractor' 导入了 EventEmitter 时得到了这个。我怪我的 IDE 竟然提出了这个建议!
应该从核心导入:
import { EventEmitter } from '@angular/core';
我在使用 typeorm 和 nextjs 时遇到了同样的 warnnig。 我通过使用 here
中的代码将其静音const FilterWarningsPlugin = require('webpack-filter-warnings-plugin');
module.exports = {
...
plugins: [
//ignore the drivers you don't want. This is the complete list of all drivers -- remove the suppressions for drivers you want to use.
new FilterWarningsPlugin({
exclude: [/mongodb/, /mssql/, /mysql/, /mysql2/, /oracledb/, /pg/, /pg-native/, /pg-query-stream/, /react-native-sqlite-storage/, /redis/, /sqlite3/, /sql.js/, /typeorm-aurora-data-api-driver/]
})
]
};
我在上面的排除数组中添加了这样的正则表达式。
/Critical dependency/