You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Webpack打包支持运行时按命令行参数引入文件的项目?

问题:Webpack打包后无法支持运行时通过命令行参数引入文件

项目结构

-- package.json
-- webpack.config.js
-- src
    |---index.js
    |---runner.js

代码详情

index.js(运行时通过命令行参数引入文件)

function requireAtRuntime(filename){
    const runner = require(filename);
    runner.run()
}

var filename = process.argv[2];
requireAtRuntime(filename);

runner.js

function run(){
    console.log("hello world");
}

exports.run = run

package.json 启动脚本

{
  "scripts": {  
    "start": "node src/index.js ./runner.js"
  }
}

问题现象

直接执行npm start可正常运行,但使用Webpack打包index.js后,runner.js未被纳入依赖。执行node dist/main.js path/to/runner.js时会报错:

Error: Cannot find module 'path/to/runner.js'

解决方案

Webpack默认会静态分析所有require调用并打包相关模块,但运行时动态传入路径的require属于动态模块引入,Webpack无法提前识别,且打包后会替换原生require为自身模块加载逻辑,导致找不到指定文件。可通过以下两种方式解决:

方式一:保留Node.js原生require(适用于完全动态的文件路径)

修改index.js中的require调用,明确告知Webpack使用Node.js原生require,避免被Webpack处理:

function requireAtRuntime(filename){
    // 使用 __non_webpack_require__ 调用Node原生require
    const runner = __non_webpack_require__(filename);
    runner.run()
}

var filename = process.argv[2];
requireAtRuntime(filename);

同时在webpack.config.js中配置target: 'node',确保打包产物适配Node.js环境:

module.exports = {
  target: 'node',
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: __dirname + '/dist',
  },
};

这种方式下,打包后的代码会使用Node原生require加载指定文件,运行时需保证目标文件路径正确,且文件未被Webpack修改。

方式二:预定义动态模块范围(适用于已知可能加载的文件集合)

如果提前知道运行时可能加载的文件范围(比如src目录下的所有JS文件),可通过Webpack上下文功能让其打包这些文件:

修改webpack.config.js,添加插件配置上下文:

const webpack = require('webpack');

module.exports = {
  target: 'node',
  entry: './src/index.js',
  output: {
    filename: 'main.js',
    path: __dirname + '/dist',
  },
  plugins: [
    // 告知Webpack打包src目录下所有.js文件作为动态模块候选
    new webpack.ContextReplacementPlugin(/src/, /\.js$/),
  ],
};

修改index.js中的路径写法,确保Webpack能识别上下文:

function requireAtRuntime(filename){
    // 基于src目录加载,Webpack会打包src下所有符合条件的文件
    const runner = require(`./${filename}`);
    runner.run()
}

var filename = process.argv[2];
requireAtRuntime(filename);

这种方式下,Webpack会把src下所有.js文件打包进产物,运行时传入的文件名需是相对于src的路径(比如执行node dist/main.js runner.js)。

内容的提问来源于stack exchange,提问作者Surya Srivastava

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:24:13