【问题标题】:Is this webpack warning safe to ignore?这个 webpack 警告可以忽略吗?
【发布时间】:2018-11-08 10:01:40
【问题描述】:

我在 webpack 中发现了一个奇怪的警告。在使用babel-loader 解析process.env 时。 webpack/lib/Parser.js 中出现警告 (TypeError: result.setExpression is not a function)。我在一个大项目上,希望我的核心超级稳固。那么忽略这个警告是否安全,因为 webpack 明确捕获它并且 cmets '忽略错误'?

警告(TypeError: result.setExpression is not a function)发生在这里(webpack/lib/Parser.js https://github.com/webpack/webpack/blob/2361995a429794d372d61e3fb628dea3929e0ca4/lib/Parser.js#L1987

evaluateExpression(expression) {
    try {
        const hook = this.hooks.evaluate.get(expression.type);
        if (hook !== undefined) {
            const result = hook.call(expression);
            if (result !== undefined) {
                if (result) {
                    result.setExpression(expression);
                }
                return result;
            }
        }
    } catch (e) {
        console.warn(e);
        // ignore error
    }
    return new BasicEvaluatedExpression()
        .setRange(expression.range)
        .setExpression(expression);
}

我打印了这个result,发现是

BasicEvaluatedExpression {
  type: 0,
  range: [ 945, 956 ],
  falsy: false,
  truthy: true,
  bool: null,
  number: null,
  regExp: null,
  string: null,
  quasis: null,
  array: null,
  items: null,
  options: null,
  prefix: null,
  postfix: null } 

我还打印了expression

{
  type: 'MemberExpression',
  start: 945,
  end: 956,
  loc: 
   SourceLocation {
     start: Position { line: 16, column: 13 },
     end: Position { line: 16, column: 24 } },
  range: [ 945, 956 ],
  object: 
   Node {
     type: 'Identifier',
     start: 945,
     end: 952,
     loc: SourceLocation { start: [Object], end: [Object] },
     range: [ 945, 952 ],
     name: 'process' },
  property: 
   Node {
     type: 'Identifier',
     start: 953,
     end: 956,
     loc: SourceLocation { start: [Object], end: [Object] },
     range: [ 953, 956 ],
     name: 'env' },
  computed: false }

process.env 来自 var isProd = process.env && process.env.NODE_ENV === 'production'; 之类的东西

背景:

完整的警告信息:

TypeError: result.setExpression is not a function
    at Parser.evaluateExpression (node_modules/webpack/lib/Parser.js:1991:14)
    at hooks.evaluate.for.tap.expr (node_modules/webpack/lib/Parser.js:368:17)
    at SyncBailHook.eval [as call] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:19:10), <anonymous>:7:16)
    at Parser.evaluateExpression (node_modules/webpack/lib/Parser.js:1984:25)
    at parser.hooks.statementIf.tap.statement (node_modules/webpack/lib/ConstPlugin.js:122:28)
    at SyncBailHook.eval [as call] (eval at create (node_modules/tapable/lib/HookCodeFactory.js:19:10), <anonymous>:7:16)
    at Parser.walkIfStatement (node_modules/webpack/lib/Parser.js:1011:41)
    at Parser.walkStatement (node_modules/webpack/lib/Parser.js:961:10)
    at Parser.walkStatements (node_modules/webpack/lib/Parser.js:864:9)
    at Parser.walkBlockStatement (node_modules/webpack/lib/Parser.js:996:8)
    at Parser.walkStatement (node_modules/webpack/lib/Parser.js:931:10)
    at inScope (node_modules/webpack/lib/Parser.js:1603:10)
    at Parser.inScope (node_modules/webpack/lib/Parser.js:1910:3)
    at Parser.walkFunctionExpression (node_modules/webpack/lib/Parser.js:1596:8)
    at Parser.walkExpression (node_modules/webpack/lib/Parser.js:1509:10)
    at Parser.walkAssignmentExpression (node_modules/webpack/lib/Parser.js:1694:8)
    at Parser.walkExpression (node_modules/webpack/lib/Parser.js:1491:10)
    at Parser.walkExpressionStatement (node_modules/webpack/lib/Parser.js:1000:8)
    at Parser.walkStatement (node_modules/webpack/lib/Parser.js:946:10)
    at Parser.walkStatements (node_modules/webpack/lib/Parser.js:864:9)
    at Parser.walkBlockStatement (node_modules/webpack/lib/Parser.js:996:8)
    at Parser.walkStatement (node_modules/webpack/lib/Parser.js:931:10)
    at inScope (node_modules/webpack/lib/Parser.js:1792:10)
    at Parser.inScope (node_modules/webpack/lib/Parser.js:1910:3)
    at Parser._walkIIFE (node_modules/webpack/lib/Parser.js:1780:8)
    at Parser.walkCallExpression (node_modules/webpack/lib/Parser.js:1817:9)
    at Parser.walkExpression (node_modules/webpack/lib/Parser.js:1500:10)
    at Parser.walkVariableDeclaration (node_modules/webpack/lib/Parser.js:1381:32)
    at Parser.walkStatement (node_modules/webpack/lib/Parser.js:979:10)
    at Parser.walkStatements (node_modules/webpack/lib/Parser.js:864:9)
    at Parser.parse (node_modules/webpack/lib/Parser.js:2127:9)
    at doBuild.err (node_modules/webpack/lib/NormalModule.js:446:32)
    at runLoaders (node_modules/webpack/lib/NormalModule.js:327:12)
    at node_modules/loader-runner/lib/LoaderRunner.js:370:3
    at iterateNormalLoaders (node_modules/loader-runner/lib/LoaderRunner.js:211:10)
    at iterateNormalLoaders (node_modules/loader-runner/lib/LoaderRunner.js:218:10)

我的 babel 配置是:

"webpack": "4.25.1",
"babel-core": "6.26.3",
"babel-eslint": "8.2.6",
"babel-loader": "7.1.5",
"babel-plugin-transform-class-properties": "6.24.1",
"babel-plugin-transform-object-rest-spread": "6.26.0",
"babel-plugin-transform-runtime": "6.23.0",
"babel-preset-env": "1.7.0",
"babel-preset-react": "6.24.1",
"babel-register": "6.26.0",


const babelCoreConfig = {
    babelrc: false,
    presets: [
       'babel-preset-env',
       'babel-preset-react'
    ],
    plugins: [
       'babel-plugin-transform-class-properties',
        ['babel-plugin-transform-runtime', {
            helpers: true,
            polyfill: false,
            regenerator: false,
        }],
       'babel-plugin-transform-object-rest-spread'
    ]
};

【问题讨论】:

  • 你试过在webpack's issue tracker问这个吗?
  • @c-chavez 是的。它有 400 多个未解决的问题,当我尝试开始一个新问题时,它建议,对于错误报告或功能请求以外的问题,&lt;!-- Please ask questions on StackOverflow or the webpack Gitter (https://gitter.im/webpack/webpack). --&gt;。更重要的是&lt;!-- Issues which contain questions or support requests will be closed. --&gt;

标签: webpack babeljs babel-loader


【解决方案1】:

我也遇到过同样的问题,并努力解决了大约半天。我在module.hot 表达式中收到此警告。我正在使用 react-hot-loader。

我在webpack-dev-server --hot --config ./webpack.dev.config.js --mode development 中删除了--hot 选项,并在webpack 配置中添加了webpackHotModuleReplacementPlugin。这解决了问题。

process.env 在哪里使用?如果它在 webpack 配置中,并且如果你的 webpack 配置是一个简单的 JS 对象导出,它将是未定义的。

如果它在一个文件中,尝试记录它并检查它是否未定义。

【讨论】:

  • 我没有使用webpack-dev-serverreact-hot-loaderprocess.env 被用在很多文件中,其中两个报告有这个问题。
  • 仅供参考,我遇到了这个错误 with webpackHotModuleReplacementPlugin
  • 我没有运行 react 但删除 --hot 为我修复了这个错误。
  • 在 webpack 配置中删除 new webpack.HotModuleReplacementPlugin(), 对我有用。谢谢你的灵感。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2020-09-10
  • 2021-07-24
  • 2017-04-14
  • 2017-10-19
  • 2021-05-29
相关资源
最近更新 更多