简介
JavaScript中的不可变集合
不可变数据一旦创建就不能改变,这样可简化应用开发、无防御复制、启用更先进的内存方案,以及使用更简单的逻辑检查更新。持久化数据提供可修改的API,这些API不在原地更新数据,而是产生新的更新后的数据。
Immutable.js提供了很多持久化不可变数据结构,包括: List, Stack, Map, OrderedMap, Set, OrderedSet以及Record。
这些数据结构在现代JavaScript虚拟机都非常高效的,使用的是通过hash映射以及向量尝试,和Clojure和Scala中流行的那些一样,最小化需要拷贝和缓存的数据。
Immutable.js也提供了惰性Seq, 允许有效的方法链式操作,例如map和filter,不用创建中介变量。使用Range和Repeat创建一些Seq。
更多的信息,可参阅Immutable.js官网。
以上是从官网上翻译过来的一段描述文字。下面将从代码的层面进行简单剖析。
Immutable.js源码分析
源码地址为:https://github.com/facebook/i...。 对于JavaScript包来说,首先我们可以先看看package.json文件,看看构建相关的脚本命令以及做了哪些操作。
...
"main": "dist/immutable.js",
"typings": "dist/immutable-nonambient.d.ts",
"typescript": {
"definition": "dist/immutable.d.ts"
},
"scripts": {
"build": "run-s build:*",
"build:dist": "run-s clean:dist bundle:dist copy:dist stats:dist",
"build:pages": "gulp --gulpfile gulpfile.js default",
"stats:dist": "node ./resources/dist-stats.js",
"clean:dist": "rimraf dist",
"bundle:dist": "rollup -c ./resources/rollup-config.js",
...
通过npm install immutable安装这个包之后,我们在引入这个包的时候,实际上定位的文件是dist/immutable.js, 如果使用TypeScript定义信息,对应于dist/immutable.d.ts。
然后看看scripts部分,可以看到build是构建目标代码的命令, 这里使用了run-s build:*。
这里我们使用的是npm-run-all。 这里我们只需要知道,这个命令可以并行或串行的运行一系列的npm脚本就行了。 更详细的介绍,直接进它里边的github页面进行查看即可。
npm run build执行三件事,打包源代码到dist/immutable.js中, 复制TS定义到dist/immutable.t.ds, 最后还做了dist-stats。
其中构建目标代码这块使用的rollup打包工具实现的, 暂时不深入rollup的详细信息, 感兴趣的可以参考后面的连接。
这里我们是将src中的源代码Immutable.js打包到dist/immutable.js中去。
src项目结构
+-- utils 工具包
|-- Collection.js Collection数据结构
|-- CollectionImpl.js
|-- Hash.js
|-- Immutable.js 该包的主文件
|-- Iterator.js
|-- List.js
|-- Map.js
|-- Math.js
|-- Operations.js
|-- OrderedMap.js
|-- OrderedSet.js
|-- Predicates.js
|-- Range.js
|-- Record.js
|-- Repeat.js
|-- Seq.js
|-- Set.js
|-- Stack.js
|-- TrieUtils.js
|-- fromJS.js
|-- is.js
关键词
- 不可变数据: Immutable Data
- 无防护数据拷贝: no defensive copy
- 先进内存方案: advanced memoization
- 检测更新技术: change detection techniques
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。