React-router中结合webpack实现按需加载实例
简要介绍在React-router中,暴露了3个接口,如果结合webpack的code splitting,就通过切换路由实现按需加载。
1.webpack的code splitting
webpack可以通过一些方法,来实现按需加载,暴露的接口为require.ensure
require.ensure(["module-a", "module-b"], function() { var a = require("module-a"); // ... });
这个require.ensure保证了模块的异步调用,当callback回调中调用了一个模块的时候,可以实现按需加载。
2.React-router实现按需加载的接口
React-router定义了 getChildRoutes, getIndexRoute, getComponents这样3个方法,这3个方法是异步的,并且只在需要的时候调用,通过这3个方法定义的路由,我们称之为“渐进式路由匹配”,React-router在匹配到路由时,只是渐进式的加载改路由所需要的组件,这样就能实现按需加载。
(1)webpack的配置
output: { path: __dirname + '/dist/js/', publicPath:'/js/', filename: '[name].js', chunkFilename: '[name].[chunkhash:5].chunk.js' },
在这里我们加上了chunkFilename…. 这句代码用于分割js,特别注意publicPath这个路径要与服务器的资源的路径对应,否则加载js的时候会出现404错误。
(2)通过getComponents等3个方法重新配置路由
export const routes={ path:'/', getComponent(nextState,callback){ require.ensure([],require=>{ callback(null,require('../ponents/nav').default); },'nav'); }, indexRoute:{ getComponent(nextState,callback){ require.ensure([],require=>{ callback(null,require('../ponents/examine').default); },'examine'); } }, childRoutes:[{ path:'examine', getComponent(nextState,callback){ require.ensure([],require=>{ callback(null,require('../ponents/examine').default); },'examine'); } }, { path:'admin', getComponent(nextState,callback){ require.ensure([],require=>{ callback(null,require('../ponents/admin').default); },'admin'); } }, { path:'history', getComponent(nextState,callback){ require.ensure([],require=>{ callback(null,require('../ponents/history').default); },'history'); } }, { path:'feedback', getComponent(nextState,callback){ require.ensure([],require=>{ callback(null,require('../ponents/feedback').default); },'feedback') } } ] };
这里我们将路由定义中的ponent替换成了 getComponent。
(3)效果
首页时候,加载了examine.js和nav.js
切换路由时,比如从首页切换到了商品管理,这样除了加载examine.js外,多加载了admin.js
(4)
我们看到react-router的按需加载,作用主要表现在可以减少首页请求的文件的大小。
3.注意事项
1、require(‘ponents/Index').default中require方法的参数不能使用变量,只能使用字符串!
2、如果你的组件是使用es5的module.exports导出的话,那么只需要require(‘ponents/Index')即可。而如果你的组件是使用es6的export default导出的话,那么需要加上default!例如require(‘ponents/Index').default
3、如果在路由页面使用了按需加载(require.ensure)加载路由级组件的方式,那么在其他地方(包括本页面)就不要再import了,否则不会打包生成chunk文件。简而言之,需要按需加载的路由级组件必须在路由页面进行加载。
特别是第3点,笔者就是因为这个原因导致按需加载失败,特别注意import不能在任何地方引入按需加载的组件。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持狼蚁SEO。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程