调研笔记。
- 问题
- package.json 里的各个项是什么意思?
 - cjs, esm, umd, amd 是什么意思?他们是怎么来的?
 - es 2015 和 es6 是什么关系?
 - tree-shaking 怎么实现的?
 - 为什么有 .mjs?
 - 组件打包怎么处理补丁?
@babel/plugin-transform-runtime要不要加 polyfill? 
 - 两个功能
- doc 命令
- 包括 
doc dev和doc build - 基于 docz 实现
 - 实现上可以再分层,通过 umi-plugin-docz 实现,这样项目要用 docz 也可以用
 - 然后 library 引 umi-plugin-docz 实现 doc 命令
 
 - 包括 
 - build
- 基于 rollup + babel
 
 - publish
- changelog
 - commit
 - tag
 - push
 
 
 - doc 命令
 - 调研
- htm
- https://github.com/developit/htm
 - 基于 micro bundle
 microbundle src/index.mjs -f es,umd --no-sourcemap --target web
 - redux
- 基于 rollup
 - 打出以下格式
- lib/redux.js
- commonjs (cjs)
 - external 依赖
 - 不压缩
 
 - es/redux.js
- es module
 - external 依赖
 - 不压缩
 
 - es/redux.mjs
- 为浏览器用的 es module
 - es module
 - 不 external 依赖
 - replace NODE_ENV 为 production
 - 压缩
 
 - dist/redux.js
- umd,暴露为 Redux 全局变量
 - replace NODE_ENV 为 development
 - 不压缩
 
 - dist/redux.min.js
- umd,暴露为 Redux 全局变量
 - replace NODE_ENV 为 production
 - 压缩
 
 
 - lib/redux.js
 
 - react-router
- cjs/react-router.js
- commonjs
 - external 依赖
 - 同步生成 min 文件
 
 - esm/react-router.js
- es module
 - external 依赖
 - babel 配 runtimeHelpers: true,并且加 @babel/transform-runtieme + useESModules: true
 
 - umd/react-router.js
- globals = react: React
 - 对外露出 ReactRouter
 - 调 commonjs 插件把 commonjs 转成 esm,让 node_modules 下的模块也能走 tree-shaking
 
 
 - cjs/react-router.js
 - reach-router
- es
- 把 src 下的文件打到 es 目录下
 - 基于 babel,env + modules: false,不做 modules 转化
 
 - cjs
- 把 src 下的文件打到 ./ 根目录
 - 基于 babel, env + modules: 'commonjs'
 
 - umd
- umd/reach-router.js
- 有 min 版本
 - 基于 rollup
 - globals 掉 react 和 react-dom
 
 
 - umd/reach-router.js
 
 - es
 - redux-saga
- 多包,基于 lerna,
lerna run --parallel build- lerna-alias
 
 - external peer 是什么意思?
 - 有类似 react 的 cjs entry proxy,自动切 production 和 development 时的 cjs 模块
 - umd 包时只 external peerDependencies,cjs 和 esm 包 external dependencies + peerDependencies
 - effects/package.json 子路径
 - 有用到 experimentalCodeSplitting
 
 - 多包,基于 lerna,
 - immer
- dist/immer.js
- cjs
 - 不压缩
 
 - dist/immer.umd.js
- umd
 - 压缩
 
 - dist/immer.module.js
- es
 - 不压缩
 
 
 - dist/immer.js
 - mobx
- 把 src 生成 .build.es5 和 .build.es6
 - 生成以下文件
- 基于 rollup
 - lib/mobx.js, cjs
 - lib/mobx.module.js, esm
 - lib/mobx.es6.js, esm
 
 - 生成 umd 包 lib/mobx.umd.js
- 基于 browserify
 
 - 基于 envify 生成 lib/mobx.prod.js
 - 基于 uglifyjs 生成
- lib/mobx.min.js
 - lib/mobx.umd.min.js
 
 
 
 - htm
 - 几种格式
- es 5 module system
- cjs (common js)
- require 和 module.exports
 - 同步加载
 - 适合 server 端
 
 - amd
- Asynchronous Module Definition
 - seajs, requirejs
 - define + require
 - 异步加载
 - 适合 browser 端
 
 
 - cjs (common js)
 - es 6 modules
- 来自 es6 / es2015
 - 同时解决 cjs 和 amd 的需要
 - export (default) 和 import
 - 浏览器里怎么用?
- import()
 - require.ensure()
 - System.import()
 - type="module"
 
 
 - umd
 
 - es 5 module system
 - 产出格式
- cjs
- 给谁用?
- node 端
 - 组件是不是不用产出 cjs 产物?
- 不是,比如要支持 ssr
 
 
 - 怎么产生?倾向后者。
- babel 直接转,比如把 src 转成 cjs 或 lib,多文件,然后 package.json 里配 lib
 - rollup 转,单文件,比如生成 dist/[name].js
- 可以区分 development 和 production
 - 可以有 proxy 层,自动引入 dev 或 prod 版本
 
 
 - 注意点
- external dependencies + peerDependencies
 
 
 - 给谁用?
 - esm
- 给谁用?
- webpack(浏览器端)
 - 浏览器直接用
script type="module"
 - node 端?
- TODO,是否可以通过 .mjs 扩展直接用?
 - https://nodejs.org/api/esm.html
 
 
 - 为什么用?
- 新版方案,解决 commonjs 和 amd 的方案
 - tree shaking,因为是静态的产出
 
 - 怎么产生?
- babel 转,比如把 src 转成 es,多文件,然后 package.json 里配 es
 - rollup 转,单文件,比如生成 dist/[name].esm.js
- esm 已经可以做 tree-shaking,所以不需要产生多个文件,即可实现按需
 - 单文件在 webpack 使用时更快,因为少了文件系统 io
 
 
 - 注意点
- external dependencies + peerDependencies
 - 根据库的实际情况考虑是否配 
sideEffect: false或者sideEffect: [文件1, 文件2] 
 
 - 给谁用?
 - umd
- 给谁用?
- 浏览器直接引
 
 - 怎么产生
- rollup
- 单文件,比如生成 dist/[name].umd.js
 - 同时生成 min 文件,比如 dist/[name].umd.min.js
 - 然后在 package.json 里配 unpkg 或 umd:main 指向他
 
 - webpack
- 感觉会慢且大
 
 - browserify
- 过时
 
 
 - rollup
 - 注意点
- 只 external peerDependencies,不 external dependencies
- 比如我们通常要 external react, react-dom, antd, dva 等
 - rollup 里通过 globals 实现
 
 
 - 只 external peerDependencies,不 external dependencies
 
 - 给谁用?
 
 - cjs
 - 方案
- 基于 rollup
- 相比 webpack
- 构建速度快
 - 产物小
 - tree-shaking 优势
- 通过 commonjs 插件,把 node_modules 下的依赖也转成 esm,使之支持 tree-shaking
 
 
 - 专注于组件构建,社区成熟
 
 - 相比 webpack
 - 关于配置
- 配置方式
- umi 通过插件使用,
['umi-plugin-library', {}] - bigfish 通过 library 配置
 
 - umi 通过插件使用,
 - 配置项
- entry: 
src/index.js - extraBabelPlugins
- 比如为 antd 配置 babel-plugin-import
 
 - umd
- globals(别名:externals)
- 比如 
react:React,'react-dom':ReactDOM 
 - 比如 
 
 - globals(别名:externals)
 - cjs
- type: 
rollup | babel - dir: 
lib - proxy: 
true | false 
 - type: 
 - esm
- type: 
rollup | babel - dir: 
es 
 - type: 
 - doc
- 透传给 umi-plugin-docz 用
 
 
 - entry: 
 
 - 配置方式
 - 脚手架 MVP
- 注:不包含 doc 的部分
 - package.json
- name: 
foo - main: 
dist/foo.js- cjs
 
 - module: 
dist/foo.esm.js - unpkg: 
dist/foo.umd.js 
 - name: 
 - src
- Foo.js
 - Bar.js
 - index.js
- import from Foo.js and Bar.js
 
 - index.css
 
 - 输出
- dist/
- foo.js
 - foo.esm.js
 - foo.umd.js
 - foo.umd.min.js
 - 一一对应的 css 文件
 
 
 - dist/
 
 - 使用场景
- react 组件
 - 非 react 组件
 - 独立库
 - 集成在项目中使用
- 可指定 entry,比如 components/index.js
 - 可指定输出路径,并在此路径包含 package.json
- name
 - dependencies
 - 等等
 
 
 - lerna 项目
 
 - 包含功能
- doc
- dev
 - build
 - publish
 
 - build
- 支持 
-w, --watch 
 - 支持 
 - test
- 走 umi-test 就好
 
 - publish
- 利用 git-extra 里的 git changelog 生成 changelog.md
 - 利用 np 发布
 
 
 - doc
 
 - 基于 rollup
 - package.json 里的项
- main
- 指向 cjs
 
 - module
- 指向 esm
 
 - unpkg
- 指向 umd
 
 - umd:main
- 同 unpkg,用一个就好了
 
 - typings
 - 这些项在 webpack 里的应用
- target 为 web 适为 browser, module, main
 - 其他 target 为 module, main
 - 所以,webpack 构建适会优先用 module
 - https://webpack.js.org/configuration/resolve/#resolve-mainfields
 
 
 - main
 - tree shaking
- 去死代码
 - 依赖 es module 的 Static module structure
- import 和 export 都是静态的
 - 相比之下,commonjs 的 require 和 exports 是动态的
 
 - 概念和名词由 rollup 引入
 - sideEffects
- 可以是 false,也可以是数组
 - 在 100% 的 ESM 世界里是不需要的
 
 
 - 脑暴
- react 包的处理方式
 - mjs
 - 怎么用?
 
 - 词汇
- JavaScript
 - ECMAScript
 - ES3
- 1999
 
 - ES5
- 第 5 版 ECMAScript,于 2009 年标准化
 
 - ES6 / ES2015
- 第 6 版
 
 - ES2016
- 第 7 版
 
 
 - JavaScript 来源
- 1995
- LiveScript,作为 Netscape Navigator 的一部分
 - 一年半后,更名为 JavaScript
 
 - 1996
- Netscape 向 ECMA International 提交标准化 JavaScript
 - 即 ECMAScript
 
 - 1999
- ECMAScript 3
 
 - 2009
- ECMAScript 5
 
 - 2015
- ECMAScript 6
 
 - 2016
- ECMAScript 7
 
 
 - 1995
 
参考
- https://medium.com/computed-comparisons/commonjs-vs-amd-vs-requirejs-vs-es6-modules-2e814b114a0b
 - http://exploringjs.com/es6/ch_modules.html
 - https://nodejs.org/api/modules.html
 - https://nodejs.org/api/esm.html
 - https://benmccormick.org/2015/09/14/es5-es6-es2016-es-next-whats-going-on-with-javascript-versioning
 - https://github.com/tc39/proposals
 - https://webpack.js.org/guides/tree-shaking/
 - http://2ality.com/2017/05/es-module-specifiers.html
 - https://github.com/standard-things/esm
 - https://unpkg.com/
 

Comments