不可变数据一旦建立就不能改变,这样可简化应用开发、无防护复制、启用更先进的内存方案,以及使用更简单的逻辑检查更新。持久化数据提供可修改的API,这些API不在原地更新数据,而是产生新的更新后的数据。node
Immutable.js提供了不少持久化不可变数据结构,包括: List, Stack, Map, OrderedMap, Set, OrderedSet以及Record。git
这些数据结构在现代JavaScript虚拟机都很是高效的,使用的是经过hash映射以及向量尝试,和Clojure和Scala中流行的那些同样,最小化须要拷贝和缓存的数据。github
Immutable.js也提供了惰性Seq, 容许有效的方法链式操做,例如map和filter,不用建立中介变量。使用Range和Repeat建立一些Seq。typescript
更多的信息,可参阅Immutable.js官网。npm
以上是从官网上翻译过来的一段描述文字。下面将从代码的层面进行简单剖析。json
源码地址为:https://github.com/facebook/i...。 对于JavaScript包来讲,首先咱们能够先看看package.json文件,看看构建相关的脚本命令以及作了哪些操做。gulp
... "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。segmentfault
而后看看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中去。
+-- 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