解决 webpack 中外部子模块的依赖

And*_*rew 1 javascript dependencies physicsjs webpack

我想包括一个模块化的第三方库(PhysicsJS)到我的WebPack项目。这个库是 AMD 和 CommonJS 友好的,并且有我想要访问的格式良好的子模块。然而,它主要是为 RequireJS 构建的,通过它的packages定义规范 in require.config(),所以入口点不是标准的index.js. 相反,入口点是physicsjs.js.

换句话说,我似乎无法弄清楚如何配置 webpack 来解析库的主文件及其子模块。看起来如果库的入口点不是index.js并且它有子模块,那么你就不走运了,我简直不敢相信这是正确的,所以我一定错过了一些东西。

那么,如何才能做出以下陈述来解决呢?

require('physicsjs'); // entry point
require('physicsjs/bodies/rectangle');  // submodule
Run Code Online (Sandbox Code Playgroud)

我尝试过此配置的变体:

resolve: {
    modulesDirectories: [
        'js/bower_components'
    ],
    alias: {
        'physicsjs': 'PhysicsJS/dist/',
        // doesn't find physicsjs.js

        'physicsjs': 'PhysicsJS/dist/physicsjs.js'
        // doesn't find the submodules
    }
},
Run Code Online (Sandbox Code Playgroud)

目录结构如下所示:

+ js
  - main.js
  + bower_modules
    + PhysicsJS
      + dist
        - physicsjs.js // module entry point
        + bodies
          - rectangle.js // desired submodule
  + lib
    - MyModule.js
Run Code Online (Sandbox Code Playgroud)

请注意,PhysicsJS 确实有整个库的缩小版本,如果没有其他选择,我将使用它,但我宁愿只加载我实际使用的内容。

此外,子模块本身使用require('physicsjs'),所以通话require('physicsjs/physicsjs')不是一个解决方案

And*_*rew 5

解决方案是将别名声明两次,首先作为完全匹配(使用尾随$),然后再次作为正常匹配(无尾随$)。所以我的配置现在看起来更像这样:

resolve: {
    modulesDirectories: [
        'js/bower_components'
    ],
    alias: {
        'physicsjs$': 'PhysicsJS/dist/physicsjs.js', // Exact match
        'physicsjs': 'PhysicsJS/dist' // and again with a fuzzy match
    },
},
Run Code Online (Sandbox Code Playgroud)