升级到webpack2 & react-router-v4

#1

最近闲着没事,把自己网站上的react版本都升了一遍,发现webpack2 和 router v4都发布了一段时间了。升级看了看有什么不同。
webpack2已经有很多文章以及自家的官网都说的很多了。反而router v4没什么人说。
github链接
这里借个地方说几个v4的优点

  1. 更多的组件抽象出来。比如BrowserRouter,Switch
  2. 更加符合react的写法。所有都是组件。而数据都在props中传递。
  3. 取消了getComponent 。这是一把双刃剑。取消了这个之后,写法得到统一,至于异步加载的时候,可以用一个高阶函数去判断chunk.js是否加载完了,中间还能做一个过渡动画的组件去让加载时候没那么枯燥

而缺点也有很多。最大的一样就是,妈蛋,我还没学过v3,v4就出来了……

#2

大神,急切想知道第3条怎么做啊。。。怎么通过高阶函数是否加载完啊?

#3

看我发出来的链接的demo,里面有

#4

恩恩,,看到了,,很强大啊,,但是出了一个错误 ,显示 System.import is not a function 不知为何?

#5

你是webpack 2.x么?

#6

lz你好,看了你的代码,我有一个疑问:

function asyncComponent(getComponent) {
  return class AsyncComponent extends React.Component {
    static Component = null;
    state = {Component: AsyncComponent.Component}

    componentWillMount() {
      if (!this.state.Component) {
        getComponent().then(Component => {
          AsyncComponent.Component = Component   //  这一句不太明白?是用来干嘛的
          this.setState({Component})
        })
      }
    }
    render() {
      const {Component} = this.state
      if (Component) {return <Component { ...this.props} />}
      console.log(Component);
      return (<Loading />)
    }
  }
}

#7

看这个模块的调用

const userRouter = asyncComponent(() => System.import('./user/index').then(module => module.default))

这个asyncComponent传入了一个函数() => System.import('./user/index').then(module => module.default)
这个函数就是getComponent。用到了webpack2 的System.import。当它的JS文件加载完之后会执行then内的操作,并把JS里面模块作为参数module => module.default
回到你的问题上,其实就是把加载好的模块写上AsyncComponent.Component上。

#8

System.import是webpack2 才有的

#9

恩恩,,知道了哈。。之前我用的webpack 1.x ,所以用不了,但是我把webpack 升级到2.x 又出了一些意想不到的错误,蛋疼啊。

#10
#11

读英文文档毫无障碍……

#12

顶…

#13

下午看了一下webpack 2的文档……发现2.4版本的已经抛弃了System.import。直接启用了ES6的import来代替……技术更新真快

#14

额,,好吧,,我试试直接用import来引用看看

#15

我用webpack 1.x 版本 不写System.import 前面那个System ,就报错了,,该怎么写啊?

#16

嗯,明白了,AsyncComponent这个实例在内存中只有一个吧,挂载Component之后,后续哪里需要用到这个呢?挂上去的目的是什么呢?

#17

想说async的事不需要router来控制,router只是根据url来render各种component。
用redux-thunk或者redux-saga处理,方便自由。

#18

这些东西又没有一个官方的标准,谁能说得准……只能说你喜欢用什么就用什么……
在我看来,按照路由划分chunk比较直观的……

#19

1.x版本是有一个require.ensure的

#20

好像那个require.ensure没法实现那种路由切换加上loading效果吧?我也一直在方法实现这个,但是是小白,搞不懂⊙_⊙