如何在Webpack中执行代码分割

代码捆绑

我很早就写过几个关于 Javascript 脚本的捆绑的帖子,人们可能认为我是疯狂的热衷于应用捆绑,但是我认为我是情不自禁的,因为它是非常有趣的:-)。

有几篇我写的文章是关于实现最小可能的捆绑的,其中我关注最多的是单文件的捆绑并且会尝试将文件的大小变得很小。其中一个例子是我的 Angular 捆绑 邮件

代码分割

这一直都不错,直到有一天遇到不能以单文件形式下载整个应用的情况。有时候你必须在应用程序中使用多个打包的脚本。

这就是需要对代码进行分割的地方。通过将应用程序拆解成多个部分,你才可以按照用户当前操作提供应用程序中相关的部分。

提到最小的单包,Webpack 通常最后来处理文件大小,但这往往不是恰当的时机。Rollup 在这方面就好得多,但它对代码分割的支持则较弱。

Webpack 各分块文件的大小总和会超出单个 Rollup 打包出来的文件的大小,但这在你的应用中很可能不是什么问题。

如果你根据需求来对 Webpack 产生和各个包进行懒加载,那么用户最终下载的内容可能只是完整 Rollup 生成的包文件的一部分。

最终,更小更有针对性的打包会比单包给用户带来更多好处。当然如果你的应用中没什么机会用以懒加载,这些好处就不存在。

允许代码分割

下面的章节中我会展示如何以最简单的方式配置代码分割。我会把代码分割为两个应用包以及一个包含公共代码的库包。

下面是源码:

car-service.js

import { LoggerService } from './logger-service';

export class CarService {

  constructor() {    this.logger = new LoggerService();
  }

  getCar() {    this.logger.logMessage('getting car');    return 'BMW';
  }
}

person-service.js

import { LoggerService } from './logger-service';

export class PersonService {

  constructor() {    this.logger = new LoggerService();
  }

  getPerson() {    this.logger.logMessage('getting person');    return 'Joe Smith';
  }
}

logger-service.js

export class LoggerService {
  logMessage(msg) {
    console.log(msg);
  }
}

CarService 和 PersonService 会被分割到两个不同的应用包中,公共的 LoggerService 会被提取到一个共享包中。

配置

我听某些开发者说,Webpack 配置起来很难。我认为这是很多人一般不选择用 Webpack 来打包的原因之一,这也确实是
Webpack 存在的问题。新术语和模块格式可能就是入门的难点所在,但我相信人们会很快克服它们。尤其是在人们认识到优化打包优点的时候。

实际上对 Webpack 进行基本的配置是很简单的。我这个例子就是很基础,你可以很容易对其进行扩展,进行更高级的设置。

webpack-config.js

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

module.exports = {
  entry : {
    person: './src/code-splitting-webpack/person-service.js',
    car: './src/code-splitting-webpack/car-service.js'
  },
  output: {
      filename: '[name].bundle.js',
      path: path.resolve(__dirname, '../../dist')
  },
  plugins: [    new webpack.optimize.CommonsChunkPlugin({
        name: 'lib',
        minChunks: 2,
        filename: '[name].js',
    })
  ]
}

我的配置中首先定义了 entry.person 和
entry.car,它们是我那些包的分割点。有了这个配置,就可以生成两个不同的应用包了。包名由 [name].bundle.js
规则来生成,[name] 在这里是一个占位符,它会被替换为 “car” 和 “person”。

如果配置到这里就结束,最终会得到两个包含完整应用程序功能的包。这是因为两个包中会有一些重复的东西来自共用的 LoggerService。默认情况下 LoggerSerivce 会被添加到两个包中。

CommonsChunkPlugin 可以解决这个问题。它会让 Webpack 将所有包中共用的公共代码拆分出来形成第三个包。

这个例子中的共享包非常简单,不过你可能不想在共享包中包含所有重复的代码。注意到 minChunks 配置项,这个配置项允许你指定要加入共享包的代码需要被重复使用的最小次数。

我把代码发布在 Github 上,如果你有兴趣可以取下来看看。

可以通过下面的 Webpack 命令来执行示例:

webpack --config webpack.config.js --progress

如果你喜欢这篇文章,请推荐给你的朋友。

作者:四明狂客

来源:51CTO

时间: 2024-10-03 17:30:43

如何在Webpack中执行代码分割的相关文章

如何在C#中执行dbcc checkident('DCDCinfo', RESEED, 0);

问题描述 如何在C#中执行dbcccheckident('DCDCinfo',RESEED,0);给几行代码示例好吗 解决方案

如何在CODE中使用代码在网页中打开一个新窗口?

问题描述 如何在CODE中使用代码在网页中打开一个新窗口?protectedvoidBtnAddContact_Click(objectsender,EventArgse){if(Page.IsValid){}}备注说明:在HTML中可以直接使用window.open这个我知道 解决方案 解决方案二:Response.Write("<script>window.open</script>");解决方案三:这样啊,我的意思是,还没有别的,不用写<script

在指定应用程序域中执行代码

程序|执行 超级入门级:) 哈哈~ 留个纪念.//// 在指定应用程序域中执行代码////// using System;using System.Collections.Generic;using System.Text; namespace DomainTest{    class Program    {        private static string strKey = "Key1";         static void Main(string[] args)   

如何在.net 中执行console命令

执行 如何在.net 中执行console命令Private Sub form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        '创建一个新的进程对象        Dim myCmdProcess As New Process        '注册进程退出事件        'myCmdProcess.Exited += New System.EventHa

mfc入门-如何在mfc中写代码使相对应的按钮实现代码的功能

问题描述 如何在mfc中写代码使相对应的按钮实现代码的功能 如何在mfc中写代码使相对应的按钮实现代码的功能 解决方案 双击按钮,会自动产生一个处理函数,或者按ctrl+w,调出classwizard,下拉选择控件,右边选择处理的消息.最后确定,编写代码. 解决方案二: 我写的MFC代码 解决方案三: 你直接双击资源中的按钮,编译器就会帮你生成对应的按钮响应函数,你就可以更改了 还可以对比源代码前后,知道编译器帮你自动生了那些代码.

如何在 Excel 中执行公式计算

早于 Microsoft Excel 2002 的 Excel 版本 在早于 Excel 2002 的版本的 Excel,公式计算基于工作表的工作表,从 Excel 工作簿的 Sheet1 开始执行.在工作表 Sheet1 上完成计算后,Excel 会计算 Sheet2 上的公式直到计算工作簿的所有工作表上所有公式. 此进程工作正常,只要引用单元格和从属单元格处于同一工作表.如果引用单元格和从属单元格不同的工作表上,但跨工作表引用,这可能会导致一些问题. 例如,如果工作表 Sheet1 中的公式

如何在 Excel 中执行公式计算,excel公式计算怎么用

早于 Microsoft Excel 2002 的 Excel 版本   在早于 Excel 2002 的版本的 Excel,公式计算基于工作表的工作表,从 Excel 工作簿的 Sheet1 开始执行.在工作表 Sheet1 上完成计算后,Excel 会计算 Sheet2 上的公式直到计算工作簿的所有工作表上所有公式.   此进程工作正常,只要引用单元格和从属单元格处于同一工作表.如果引用单元格和从属单元格不同的工作表上,但跨工作表引用,这可能会导致一些问题.   例如,如果工作表 Sheet

如何在nhibernate中执行SQL语句

问题描述 在网上查了很多大部分给出如下代码:publicIListExecuteSQL(stringquery){IListresult=newArrayList();ISessionFactoryImplementors=(ISessionFactoryImplementor)cfg.BuildSessionFactory();IDbCommandcmd=s.ConnectionProvider.Driver.CreateCommand();cmd.CommandText=query;IDbC

【译】如何在 Webpack 2 中使用 tree-shaking

本文讲的是[译]如何在 Webpack 2 中使用 tree-shaking, 原文地址:How to do proper tree-shaking in Webpack 2 原文作者:Gábor Soós 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m- 译者:薛定谔的猫 校对者:lsvih.lampui 如何在 Webpack 2 中使用 tree-shaking tree-shaking 这个术语首先源自 Rollup -- Rich Harris 写的