我正在尝试在我的webpack项目中包含一个模块化的第三方库(PhysicsJS)。该库对AMD和CommonJS友好,并具有我要访问的格式正确的子模块。但是,它主要是通过packages中的require.config()定义规范为RequireJS构建的,因此入口点不是标准的index.js。入口点是physicsjs.js

换句话说,我似乎无法弄清楚如何配置webpack来解析库的主文件及其子模块。似乎如果库的入口点不是index.js且具有子模块,那么您就走运了,而我简直不敢相信那是正确的,因此我肯定会丢失一些东西。

那么,如何解决以下问题?

require('physicsjs'); // entry point
require('physicsjs/bodies/rectangle');  // submodule


我尝试了此配置的变体:

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

        'physicsjs': 'PhysicsJS/dist/physicsjs.js'
        // doesn't find the submodules
    }
},


目录结构如下所示:

+ js
  - main.js
  + bower_modules
    + PhysicsJS
      + dist
        - physicsjs.js // module entry point
        + bodies
          - rectangle.js // desired submodule
  + lib
    - MyModule.js


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

而且,子模块本身使用require('physicsjs'),因此调用require('physicsjs/physicsjs')并不是解决方案。

最佳答案

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

resolve: {
    modulesDirectories: [
        'js/bower_components'
    ],
    alias: {
        'physicsjs$': 'PhysicsJS/dist/physicsjs.js', // Exact match
        'physicsjs': 'PhysicsJS/dist' // and again with a fuzzy match
    },
},

09-19 04:00