javascript - 如何从 Webpack 的导出中排除 vendor 模块 peerDependencies?

标签 javascript angularjs webpack angular-material

问题

在 Webpack 中导出 bundle 时,如何排除 3rd-party 模块的 peerDependency? (不是第三方模块本身)

背景

我想在 angular-material 框架之上创建一个带有自定义组件的 UIkit。使用 Webpack,我可以将我的自定义组件和 Angular Material 捆绑在一起,形成 uikit.js 之类的东西,然后稍后移植到其他应用程序。但是,我不想将 angular 模块本身包含到此 uikit.js 中。

问题

似乎 Webpack 足够“聪明”,注意到 angular 模块是 angular-material 模块的依赖项,因此会同时导出 angular 模块和 angular-material 模块到包中。可以使用 config.externals: {'angular': 'angular'}new webpack.IgnorePlugin(/angular$/) 来排除 angular 模块在应用程序中明确需要,但对于 peerDependency(即 angular-material 中需要的那个),它仍会包含它。

那么,我怎样才能从导出中排除这个依赖于第 3 方的模块呢?

示例:

// app.js
var angular = require('angular');
var material = require('angular-material');

// ... other application logic    

// webpack.config.js
var webpack = require('webpack');

module.exports = {
  entry: {
    app: './app.js'
  },
  module: {
    loaders: [
      // some module loaders
    ]
  },

  // This only excludes the angular module require by the app, not the one require by the angular-material
  externals: {'angular': 'angular'},

  plugins: [
    // This is the same as externals, only the one required by app.js would be excluded
    new webpack.IgnorePlugin(/angular$/)
  ]
};

最佳答案

在 webpack(第 4 版)配置中,我将 vendor 应用程序导出到 vendor 包中,并像这样分块:

entry: {
  app: './app.js',
  vendor: [ 'angular', 'angular-material', '...' ],
},
optimization: {
  splitChunks: {
    chunks: 'all',
  }
},

基本上,这表明将选择哪些 block 进行优化,all 意味着即使在异步和非异步 block 之间也可以共享 block 。此外,如何构建模块以及如何处理依赖关系可以进一步简化 block 大小。

此外,您可以提供一个函数,其返回值将指示是否包含每个 block :

module.exports = {
  //...
  optimization: {
    splitChunks: {
      chunks (chunk) {
        // exclude `my-excluded-chunk`
        return chunk.name !== 'my-excluded-chunk';
      }
    }
  }
};

这是一个link to webpack解释 splitChunks 插件。

关于javascript - 如何从 Webpack 的导出中排除 vendor 模块 peerDependencies?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37221172/

相关文章:

javascript - getUTCDate()函数在不同时区的问题

javascript - Paperjs group.pivot 未设置为新坐标

angularjs - AngularJS 应用程序上的 CrazyEgg 跟踪

javascript - 如何检测 JSON 模型中的属性值是否随 AngularJS 中的给定值更改

java - Spring MVC的deferredresult如何发送回客户端(Angular JS)

javascript - 减少 Vue 提供的文件数量

javascript - 从 facebook graph API 获取全尺寸图片

javascript - Angular 8 : Assign Date Values to Type Moment

javascript - Webpack 中特定于页面的 JavaScript 以及第三方脚本和应用程序范围的脚本

angular - Webpack 和 TypeScript 上的 SignalR : cannot find module './NodeHttpClient'