immer.js 简介及源码简析:更简单,更快速的创建不可变数据类型 · zhao.zhang

immer.js 简介及源码简析:更简单,更快速的创建不可变数据类型

在前端开发中,不可变数据类型(immutable data)越来越受到关注。使用不可变数据可以避免因为修改引用类型数据而带来的副作用,例如无法正确比较对象或数组是否相等,以及导致组件重复渲染等问题。

然而,在 JavaScript 中创建不可变数据类型通常需要写大量的代码,并且需要非常小心地管理所有的对象和数组。幸运的是,immer.js 可以帮助我们更轻松地创建不可变数据类型。

immer.js 简介

immer.js 是一个 JavaScript 库,它提供了一种简单且直观的方式来创建不可变数据类型。它通过使用“草稿”概念来实现这一点。在草稿中,你可以像修改普通对象一样修改嵌套对象的属性,immer 会自动处理不可变性并返回新的不可变数据。同时,immer 在内部使用了一些性能优化技巧来确保创建不可变数据的速度非常快。

使用 immer.js

让我们看一个示例,假设我们有一个包含商品的列表:

----- -------- - -
  - --- -- ----- -------- --- ------ -- --
  - --- -- ----- -------- --- ------ -- --
  - --- -- ----- -------- --- ------ -- --
--

现在我们想要将第一个商品的价格增加 5 元。使用 immer.js,我们可以这样做:

------ ------- ---- --------

----- ----------- - ----------------- ----- -- -
  -------------- -- --
---

在上面的代码中,produce 函数接受一个原始的对象或数组和一个函数作为参数。该函数会被传递一个“草稿”对象,你可以像修改普通对象一样地修改它。最后,produce 函数将返回一个新的不可变对象或数组。

注意,在草稿中修改的任何对象或数组属性都必须是可变的,否则 immer 会抛出错误。例如,如果你尝试修改一个 const 变量,那么将会引发错误。

源码简析

让我们进一步深入 immer.js 的源码来理解它的实现方式。在 immer.js 中,对象和数组都被称作“producers”,即生产者。每个生产者都有一个“draft”版本和一个“base”版本。草稿版本是可变的,而基础版本是不可变的。当你在草稿中修改对象或数组时,immer 会自动创建一个新的草稿版本,并将修改应用于它。同时,immer 还会通过比较草稿和基础版本来判断哪些属性已经发生了变化。这种技术被称为结构共享,可以大大提高不可变数据的创建速度。

produce 函数中,immer 使用 JavaScript 的 Proxy 对象来拦截草稿的读取和修改操作。这使得 immer 可以知道哪些属性已经被访问过,从而对未来的修改进行优化。同时,immer 还会将修改操作记录在一个操作队列中,待到最后完成所有操作时再将其应用于基础版本,以确保操作的顺序正确无误。

结语

immer.js 提供了一种简单而直观的方式来创建不可变数据类型,它能够极大地提高前端开发的效率和质量,并减少错误和副作用的出现。我们希望本文可以帮助你更好地理解 immer.js 并开始使用它。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/70827


猜你喜欢

  • npm 包 import-sort-parser-babylon 使用教程

    在前端开发中,我们经常使用各种 npm 包来帮助我们开发。而其中一个非常有用的 npm 包就是 import-sort-parser-babylon。这个 npm 包可以帮助我们对 JavaScrip...

    5 年前
  • npm 包 iamturns-scripts 使用教程

    前言 在前端开发中,我们经常需要进行一些常规的操作,比如启动开发服务器、打包项目、运行测试等。通常情况下,我们会使用各种工具和插件来简化这些操作,然而这些工具和插件的安装和配置往往也会比较麻烦。

    5 年前
  • npm 包 eslint-config-airbnb-typescript 使用教程

    概述 在前端开发过程中,代码的质量和规范性对于保证代码的可维护性和可扩展性非常重要。而且,在一个协作开发的团队中,每个人的编程习惯和使用习惯都不尽相同,如果没有一个统一的代码规范,会给整个项目带来不必...

    5 年前
  • npm 包 father-build 使用教程

    什么是 father-build? father-build 是一个基于 webpack 的前端构建工具,它可以让我们更方便地搭建 React 和 Vue 等前端项目的开发环境,并且支持输出多种不同的...

    5 年前
  • NPM包rc-source-loader的使用教程

    前言 随着前端技术的不断发展,不同的开发人员都希望通过高效的方式来实现代码的复用和管理。在这个过程中,npm作为一种软件包管理工具,被广泛应用于前端开发中。本篇文章我们将介绍一个名为rc-source...

    5 年前
  • npm 包 father 使用教程

    前言 在前端开发中,我们经常需要使用各种各样的 npm 包,而如何发布和维护自己的 npm 包也是前端工程师必备的技能之一。而 father 是一个非常方便的工具,可以帮助我们快速创建和维护自己的 n...

    5 年前
  • npm 包 ls-archive 使用教程

    在前端开发中,我们经常需要管理和维护大量的 npm 包,其中也包括一些早已废弃或不再使用的包。这时候,我们需要一款工具来帮助我们进行管理和清理,于是 ls-archive 就应运而生。

    5 年前
  • npm 包 spm-client 使用教程

    spm-client 是一款基于 Node.js 的前端构建工具,它可以帮助开发者管理前端项目的依赖包和资源文件,并进行构建、压缩、合并等操作,提高项目开发效率和性能。

    5 年前
  • npm包mixarg使用教程

    简介 在前端开发中,我们经常需要处理函数传参的问题, mixarg 是一个基于数组封装的 npm 插件,在函数调用时可以快捷地实现导入和处理函数参数的过程,从而提高函数参数传递的效率和代码的可读性。

    5 年前
  • npm 包 spmrc 使用教程

    npm 包 spmrc 是一个用于管理前端项目构建的工具,通过它可以快速创建前端项目,管理模块依赖等。本教程将为您详细介绍 spmrc 的使用方法,并提供相关示例代码。

    5 年前
  • npm 包 spm-argv 使用教程

    在前端开发中,我们经常会使用到 Node.js,而 npm 是 Node.js 的包管理工具,通过 npm 可以方便地安装和管理项目需要的各种库和插件。而 spm-argv 则是在 npm 上发布的一...

    5 年前
  • npm 包 scripts-hook 使用教程

    在前端的开发过程中,我们经常需要在项目中使用一些自定义的脚本来完成一些工作,如自动化构建、测试、打包等。然而,随着项目的不断发展和扩大,这些自定义的脚本往往变得越来越复杂,难以维护。

    5 年前
  • npm 包 spmtpl-loader 使用教程

    在前端开发中,我们通常需要使用模板引擎来渲染页面。而 spmtpl-loader 就是一款在 webpack 构建环境中使用的模板编译器。它可以将模板文件编译为符合 SPA(单页面应用)开发的规范,方...

    5 年前
  • npm 包 spm-webpack 使用教程

    在前端开发中,我们常常使用 npm 包来管理依赖项。而在打包构建方面,常见的工具有 webpack 和 spm,它们分别有着不同的优点。本文将介绍一个 npm 包 spm-webpack,它可以将 w...

    5 年前
  • npm 包 keen.io 使用教程

    简介 Keen.io 是一家数据分析产品公司,提供高效的数据收集、分析、可视化服务。Keen.io 的核心是基于事件的数据收集和分析方法,通过记录用户行为事件来帮助用户深入了解他们的产品,以做出更好的...

    5 年前
  • npm 包 es6-module-packager 使用教程

    在前端开发过程中,我们常常需要引入其它开源的 JS 库或框架。然而,这些库或框架往往没有经过打包或者打包后依然不能直接在前端使用,让我们不得不针对不同的场景使用不同的修改方式。

    5 年前
  • npm 包 spm-handlebars 使用教程

    在前端开发中,我们经常需要使用模板引擎对数据进行处理和渲染。而 spm-handlebars 是一款基于 Handlebars 的模板引擎库,可以帮助我们在前端中更加方便地进行数据处理和渲染。

    5 年前
  • npm 包 js2image 使用教程

    js2image 是一个 npm 包,可以将 JavaScript 代码转换为图片形式。它可以用于将代码融入到教程、文档或博客文章中。 安装 使用 npm 安装 js2image: --- -----...

    5 年前
  • npm 包 pixel-bg 使用教程

    前言 Pixel-bg 是一款非常方便的 npm 包,可以用来生成像素风格的背景图案。使用 pixel-bg 可以省去手动操作生成像素风格背景的过程,节约时间,提高开发效率。

    5 年前
  • npm 包 pixel-white-bg 使用教程

    1. 什么是 pixel-white-bg pixel-white-bg 是一个可以创建纯白像素背景的 npm 包。该包是基于 Canvas API 的封装,使用起来非常简单,适用于 Web 前端开发...

    5 年前

相关推荐

    暂无文章