react-imvc v1.0 依赖
- react/react-dom v15.x 版本
- webpack v1.x 版本
- babel v6.x 版本
升级 v2.0 后:
- react/react-dom v16.x 版本
- webpack v4.x 版本
- babel v7.x 版本。
总体 api 和用法保持不变,有少数微调的地方,会在下方一一给出。开发者可通过一一比对进行升级。
react-imvc v1.x 将 react/react-dom 内置,只需要 install react-imvc,即可把 react/react-dom 也一并 install 进来。
react-imvc v2.0 将 react/react-dom 视为 peerDependencies,install react-imvc 不会自动 install react/react-dom
开发者可自行决定使用指定版本的 react/react-dom。
方式一
- 删除 node_modules 目录
- 手动
npm install --save react react-dom
安装 v16.x 版本 - 修改
package.json
里的react-imvc
版本为^2.0.0
- 手动
npm install
方式二
- 删除 node_modules 目录
- 删除
package.json
里的react-imvc
- 手动
npm install --save react react-dom react-imvc
下载 - 手动
npm install
下载其它依赖
react-imvc v1.x 里,用户需要自行在项目文件夹下准备 .babelrc
文件。
react-imvc v2.x 里,内置了 babel 配置,通过 imvc.config.js
里的 babel
字段来自定义(通常不需要)
babel v7.x 版本去掉了简便的 stage-0
的 preset
,需要把每个 proposal
对应的 plugin
安装进来,并准确配置。
使得 babelrc
很繁琐,不宜默认暴露给开发者,因此内置到 react-imvc 里。
删除项目文件夹下的 .babelrc
文件。
react-imvc v1.x 里,通过 .babelrc 文件,所有模块在执行前都被进行 babel 编译转换。
react-imvc v2.x 里,取消 .babelrc 文件,通过 imvc.config.js 的 babel 字段提供自定义配置能力。
因此,imvc.config.js 被加载时,babel 还没有启动(它要从前者里获取配置)。
将 imvc.config.js
的 import/export
修改为 commonjs 规范的 require/module.exports
写法。
注:这不意味着不能使用 const/let
, async/await
等语法,只要所安装的 node.js 版本默认支持,可直接使用。将来 node.js 内置 ES2015 Modules 规范的支持时,此限制可解除。
react-imvc v1.x 里,加载 controller 方式如下:
export default [
{
path: '/',
controller: require('./home/Controller')
}
]
react-imvc v2.x 里,采用 dynamic import
的语法,新方式如下:
export default [
{
path: '/',
controller: () => import('./home/Controller')
}
]
v1.x 里是基于约定(所有 controller.js 都会被代码切割出去),因此直接 require 它们即可。但这个是在动态模块加载的标准规范没出现前的折中做法。
v2.x 里,页面入口文件可以不再叫 Controller.js (尽管这个命名依然是推荐的做法)。
将 require()
修改为 () => import()
。
使用 webpack v1.x 的 require.ensure
特殊语法,异步加载模块
统一使用 import()
语法异步加载模块
webpack v4.x 建议不要使用 webpack-only 的 require.ensure
语法,使用标准的 import()
用 import()
替代 require.ensure
,使用 async/await
语法获取模块加载的返回结果。
react-imvc v1.x 通过 bundle-loader 的特殊用法,将每个 controller.js
编译出来的 js 文件命名为它的文件夹名(通常就是它对应的 page 的名字)。
开发者可以通过访问 assets[pageName] 在 Layout.js 里预加载 js。
react-imvc v2.x 里,assets.js 里除了 vendor 和 index 是固定不变的,其它字段都可能不断变化,不应使用。
webpack v4.x 里使用 dynamic import
语法异步加载文件,默认情况下,模块名是动态的数字。可以通过注释(/* webpackChunkName: "lodash" */)的方式指定名称。但在构建 assets.json 时,不保证能拿到准确的名字。
react-imvc v2.x 提供了 <Prefetch />
组件,提供了 controller.prefetch
方法,提供了 <Link prefetch />
属性等三种方式,预加载其它页面的 js 文件。
可以通过访问文档)找到它们。
react-imvc v1.x 中,会用几个 div
元素包裹开发者的 View
组件,以便实现 KeepAlive
等切换能力。
<div className="imvc-root">
<div className="imvc-view-item">
<View />
</div>
</div>
react-imvc v2.x 中,去掉了 imvc-root
元素,用 React.Fragment
替代
<React.Fragment className="imvc-root">
<div className="imvc-view-item">
<View />
</div>
</React.Fragment>
react v16.x 支持 React.Fragment
,可以节省不必要的组件 root 元素,减轻 DOM 复杂度,提高性能。
如果项目中没有 css 样式依赖 imvc-root,通常不必做修改。
react-imvc v1.x 中,每个 controller 的 store.getState() 中,默认会包含一些数据。
其中包含 isClient 和 isServer 字段
react-imvc v2.0 中,删除了 state 里的 isClient 和 isServer 字段。
注:这不意味着 controller.context 里的 isClient 和 isServer 也删除了。只是没有默认填充给 state 而已。
state 通常给 view 使用,而 view 不应根据 isServer | isClient 做不同渲染,这将导致 ReactDOM.hydrate
复用服务端渲染的 DOM 结构时不匹配。
如果没有使用 state 的 isServer | isClient 这两个字段,通常不必修改。
如果需要将部分组件只在客户端渲染,可以在 componentDidMount
时,再渲染某个组件即可。这个做法更安全可靠。
react-imvc v1.x 提供了 Preload 组件,可以渲染 controller.preload 属性指定加载的内容。Style 组件就是通过 Preload 组件实现的。
react-imvc v2.x 删除 Preload 组件,更简洁地实现 Style。
注:如果没有引用 import { Preload } from 'react-imvc/component'
,只用到了 Style
组件,项目不会受影响。
Preload 组件的实用价值几乎为 0,开发者可以自己简单地实现。
没有直接使用 Preload 组件的,通常不必修改。
使用 controller.fetch 方法获取数据,存入 store 中,通过 state 传递到 view 里渲染即可。
webpack entry 配置,在 react-imvc v1.x 里,config.entry 可以配置一些模块,它们会出现在 index.js 中。
在 react-imvc v2.x 里,webpack v4.x 会自动优化模块,不需要手动加载。
修改方式为:直接删除 entry 配置
这个配置原先用来配置 webpack log 输出,在 react-imvc v2.x 中,始终使用默认的配置。
react-imvc v1.x 里,webpack 编译时会将 moment 所有 locale 模块都打包进去
react-imvc v2.x 里,内置 new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/)
忽略它们。
如果之前在 config.webpackPlugins 里配置过 IgnorePlugin moment,删除它们即可。
react-imvc v2.x 的 imvc.config.js 配置文件中,新增 babel/webpack 两个字段,可以获取到当前全部的 babel/webpack 配置结果,并提供修改的机会。
具体可以参考文档中 Config Babel 和 Config Webpack 的部分。