标签: splitchunksplugin

Webpack 4 - 使用SplitChunksPlugin从CommonsChunkPlugin迁移

我们有一个传统的服务器渲染应用程序(非SPA),其中每个页面都增加了vuejs

现有的webpack 3配置是

webpack.config.js

var webpack = require('webpack')
var path = require('path')

const ExtractTextPlugin = require('extract-text-webpack-plugin')
const CleanWebpackPlugin = require('clean-webpack-plugin')
const CopyWebpackPlugin = require('copy-webpack-plugin')

module.exports = {
    entry: {
        shared: './shared.js',
        pageA: './pageA.js',
        // pageB: './pageB.js',
        // pageC: './pageC.js',
        // etc
    },

    resolve: {
        alias: { vue: 'vue/dist/vue.esm.js' },
    },

    output: {
        path: path.join(__dirname, './dist'),
        filename: '[name].js',
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                exclude: /node_modules/,
                use: ExtractTextPlugin.extract({
                    use: [
                        {
                            loader: 'css-loader',
                            query: {
                                sourceMap: true,
                            },
                        }, …
Run Code Online (Sandbox Code Playgroud)

commonschunkplugin webpack-4 splitchunksplugin

10
推荐指数
1
解决办法
1292
查看次数

Webpack splitChunks 如何为每个 npm 包获取一个 chunk(该 chunk 应包含每个包的依赖项)

我想通过以下方式使用 Webpack 分割我的块:

每当我导入 NPM 包时,例如

import styled from "styled-components";
Run Code Online (Sandbox Code Playgroud)

我想要一个像这样的块:

styled-components.[contenthash:5].js  // INCLUDING ITS DEPENDENCIES
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的配置:

webpack.config.js

optimization: {
  runtimeChunk: 'single',
  splitChunks: {
    chunks: 'all',
    cacheGroups: {
      vendor: {
        test: /[\\/]node_modules[\\/]/,
        name(module) {
          const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
          return `npm.${packageName.replace('@', '')}`;
        },
      },
    },
  },
}
Run Code Online (Sandbox Code Playgroud)

现在我将每个依赖项styled-components作为不同的块。例如:下面的3个包都是需要的styled-components

在此输入图像描述

理想情况下,我还希望有一个commonsshared块以避免多个模块需要可能的模块。

有人知道该怎么做吗?

javascript webpack webpack-4 splitchunksplugin webpack-splitchunks

8
推荐指数
0
解决办法
1191
查看次数

如何使用 Webpack/SplitChunks 插件按目录动态拆分?

我正在尝试按以下方式使用 splitChunks 插件拆分我的 React 代码(使用 create-react-app 创建):

我有以下组件(JSX)结构:

  • 服务
    • 服务A
      • 组分A1
      • 组分A2
      • 子文件夹
        • 组分A3
      • ...
    • 服务B
      • 组件B1
      • 组件B2
      • ...
    • 服务C
      • 组件B1
      • 组件B2
      • ...
    • ...

我想要以下输出(构建):

  • 静态/js
    • 服务A
      • serviceA.bundle.chunkhash.js
    • 服务B
      • serviceB.bundle.chunkhash.js
    • 服务C
      • serviceC.bundle.chunkhash.js

(其他运行时/主电源位于 /static/js 的根目录下)

另一个限制是组件是动态加载的

const Component = lazy(() => import(componentPath));
...
<Suspense fallback={..}>Component</suspense>
Run Code Online (Sandbox Code Playgroud)

“componentPath”是动态确定的(当用户单击图标时,它会打开给定的服务)。

这样做的原因是我想将每个包包含到运行后端的单独 Docker 映像中。然后,由于应用程序路由,每个 Docker 映像都可以访问:

static/js/serviceA/  ==> js served by Docker container running service A
static/js/serviceB/  ==> js served by Docker container running service B
static/js/serviceC/  ==> js served by Docker container running service …
Run Code Online (Sandbox Code Playgroud)

reactjs webpack-4 splitchunksplugin webpack-splitchunks

7
推荐指数
1
解决办法
2144
查看次数

Webpack SplitChunksPlugin - 完全排除一个入口点

我通过 Rails + Webpacker 将 SplitChunksPlugin 与 Webpack 4 结合使用。

我有一个应用程序,我想将其拆分为多个块 - 除了一个面向公众的入口点,我希望成为一个独立的单个文件。

当我之前使用 CommonsChunkVendor 时,我可以这样做:

var adminEntries = Object.keys(environment.entry).filter(function(e) { return e !== 'app' });

environment.plugins.append(
  'CommonsChunkVendor',
  new webpack.optimize.CommonsChunkPlugin({
    name: 'vendor',
    chunks: adminEntries,
    minChunks: (module) => {
      // this assumes your vendor imports exist in the node_modules directory
      return module.context && module.context.indexOf('node_modules') !== -1
    }
  })
)
Run Code Online (Sandbox Code Playgroud)

这将排除“app”入口点被分割。

如何使用 SplitChunksPlugin 实现此目的?

webpack webpacker splitchunksplugin

6
推荐指数
0
解决办法
372
查看次数

如何使用 Webpack 获取异步块的供应商块名称?

假设我有 3 个由动态导入创建的异步块:

const Notes = lazy(() => import(/* webpackChunkName: "notes" */ 'pages/Notes'))
const Lists = lazy(() => import(/* webpackChunkName: "lists" */ 'pages/Lists'))
const Files = lazy(() => import(/* webpackChunkName: "files" */ 'pages/Files'))
Run Code Online (Sandbox Code Playgroud)

将生成:

notes.g3g43g.js
lists.534535.js
files.234f8t.js
Run Code Online (Sandbox Code Playgroud)

每个块都包含它自己的供应商依赖项。

所以在notes.g3g43g.js里面我们有react-big-calendarlodash

但是,当使用 SplitChunksPlugin 时,我们可以将chunks选项设置为all

optimization: {
  runtimeChunk: 'single',
  splitChunks: {
    chunks: 'all',
    cacheGroups: {
      vendor: {
        test: /[\\/]node_modules[\\/]/,
        name: ({ context }) => (context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1]
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

从这一点来看,react-big-calendarlodash …

javascript webpack code-splitting html-webpack-plugin splitchunksplugin

6
推荐指数
0
解决办法
915
查看次数

Webpack splitChunks插件 - 为什么设置块的优先级使其初始化异步?


我有一个问题,了解Webpack splitChunks插件的行为.我正在研究的是将现有站点上的旧脚本重写为组件并使用Webpack进行捆绑.捆绑只是JS,大多数是在身体的末端加载.但是一个小脚本需要位于页面的标题中,因为它还会在标题和正文中创建很少的全局方法,主要用作内联脚本.由于它用于GA跟踪,它不会改变,事件必须尽快发送.

下面的配置工作适合我,但问题是,为什么它的工作原理只是这样?

确切的问题是在下面的代码中的注释,但我也把它放在这里:我不明白为什么有必要也包括!isUsedInAppHeadercommon块的条件.如果没有!isUsedInAppHeader条件,则不会common.header创建块.然后,当我尝试通过为common.header块添加更高优先级来修复它时,它会导致脚本中的脚本异步初始化app.header.js.

异步行为是我根本不理解的,因为它从未发生过app.js.

实际上,我有另一个问题.是否可以导出一个同时立即初始化的公共块?或者你会提出另一个解决方案吗?标题中的脚本无法移动,也必须同步初始化,因为它的主要作用是为GA跟踪创建全局方法,这些方法必须立即用于以下代码中.

谢谢!

Webpack配置:

...
gulp.task('webpack', function(callback) {
    var settings = {
        ...
        entry: {
            'app.header':   './js/app.header.js',
            'app':          './js/app.js',
            ... // page specific files etc.
        },
        ...
        optimization: {
            splitChunks: {
                cacheGroups: {
                    // Node modules used in app.js
                    vendorsApp: {
                        test(module, chunks) {
                            let isInAppEntryPoint = chunks.map(chunk => chunk.name).includes('app');
                            let isNodeModule = /\/node_modules\//.test(upath.normalize(module.resource));
                            return isInAppEntryPoint && …
Run Code Online (Sandbox Code Playgroud)

chunks webpack splitchunksplugin webpack-splitchunks

5
推荐指数
1
解决办法
420
查看次数

任何 Webpack splitchunks.name 作为功能文档而不是来自网站?

随着 webpack 4 的引入,splitChunks.name用于定义拆分块的名称。在这里,文档说可以将键映射到用于自定义命名的函数:

https://webpack.js.org/plugins/split-chunks-plugin/#splitchunksname

它接受 params module, chunks, cacheGroupKey。这些参数的文档有点缺乏,但我可以使用一些直觉。即,cacheGroupKey与 中定义的键有关splitChunks.cacheGroups。我认为chunks是共享公共代码的块,它们是cacheGroupKey块的一部分,但在任何地方都没有关于它的官方文档。

所以,我的问题是有人对这三个参数所指的内容有任何见解吗?

webpack webpack-4 splitchunksplugin webpack-splitchunks

4
推荐指数
1
解决办法
2028
查看次数