Javascript 网页包需要外部表达式

Javascript 网页包需要外部表达式,javascript,node.js,webpack,require,commonjs,Javascript,Node.js,Webpack,Require,Commonjs,我有一个表达式require,它应该在运行时得到解决,但对于这个简单的示例,我无法理解webpack配置: import something from 'module'; import pkg from './package.json'; let a; if (pkg.main) { a = require(pkg.main); } 生成的构建应该包含模块,但在运行时还需要/package.json和pkg.main作为commonjs模块-换句话说,将它们从构建中排除 迄今为止,我的

我有一个表达式require,它应该在运行时得到解决,但对于这个简单的示例,我无法理解webpack配置:

import something from 'module';
import pkg from './package.json';
let a;

if (pkg.main) {
   a = require(pkg.main);
}
生成的构建应该包含
模块
,但在运行时还需要
/package.json
pkg.main
作为commonjs模块-换句话说,将它们从构建中排除

迄今为止,我的
webpack.config.js

var webpack = require('webpack');

module.exports = {
  entry: './src/main.js',
  output: {
    filename: '[name].js',
    path: './build'
  },
  target: 'node-webkit',
  plugins: [
    new webpack.ExternalsPlugin('commonjs', './package.json')
  ],
  module: {
    noParse: /\.min\.js/,
    exprContextRegExp: /$^/,
    exprContextCritical: false,
    loaders: [
      {
        test: /\.js$/,
        loader: 'babel',
        exclude: /node_modules/
      }
    ]
  }
};
现在发生的是对
pkg的require。main
导致
webpackMissingModule
异常,如果我删除
exprContextRegExp
,require将使用上下文


感谢您的帮助

如果您想知道:您可以使用此插件解决此问题:

function() {
  this.parser.plugin('call require', function(expr) {
    if (expr.arguments.length !== 1) {
      return;
    }

    const param = this.evaluateExpression(expr.arguments[0]);
    if (!param.isString() && !param.isConditional()) {
      return true;
    }
  });
}
网页包无法解决的任何问题都将保持原样。

更新:使用NPM软件包 安装它:
warn add webpack ignore dynamic require

启用它

//webpack.config.js
const IgnoreDynamicRequire=require('webpack-ignore-dynamic-require');
module.exports={
// ...
插件:[
新IgnoreDynamicRequest()
]
}
原始答案:自制 为了捆绑服务器应用程序,我需要它,因为它使用
require
加载本地JSON文件

基于,我能够为Webpack4创建一个插件。它可能在网页5上工作

class IgnoreDynamicRequire{
应用(编译器){
compiler.hooks.normalModuleFactory.tap('IgnoreDynamicRequest',factory=>{
factory.hooks.parser.for('javascript/auto').tap('IgnoreDynamicRequire',(解析器,选项)=>{
parser.hooks.call.for('require').tap('IgnoreDynamicRequire',表达式=>{
//这是一个SyncBailHook,因此返回任何内容都会停止解析器,并且任何内容都不允许继续
if(expression.arguments.length!==1 | | expression.arguments[0]。类型==='Literal'){
返回
}
const arg=parser.evaluateExpression(expression.arguments[0])
如果(!arg.isString()&&!arg.isConditional()){
返回true;
}
});
});
});
}
}
这比前面的答案复杂得多,但我们需要访问。在此之后,只需将其包含在
插件
数组中:

插件:[
新IgnoreDynamicRequest()
]

所有
需要的
调用都不会解析为字符串,而是保持原样。

好主意。你有没有关于如何使用上述功能的示例?是否值得将此插件作为一个包发布?这是我的第一个包。在你的评论中,你想说什么就说什么;)伟大的您是否也可以用软件包更新主要回复?