webpack, react项目中利用外部JS库提升效率

点击有惊喜


前言

现在很多前端项目在构建时,都是一个vendor 公共JS文件和和一个app.js的文件,会造成一些弊端。

  1. 在项目的开发过程中,修改任何一个地方,都会触发JS的全局构建,需要等待非常久,长久下来大大的降低了开发效率。
  2. 另外一个弊端就是每次构建上线,vendor和app每次都会改变,任何一个小的更改都会使2个文件都改变,再次发布上线,用户的第一次加载速度都会很慢。

问题分析

实际在项目的过程中,依赖的外部库一般都会不改变的,所以可以把这一部分代码作为一个外部库,发布上线后通过CDN引入,无论再次构建和再次上线,这一部分代码都不会改变。
这样就可以解决问题的疼点。

解决方法

webpack对于公共库有几种解决方法,

  1. dll-plugin: 例子:https://github.com/webpack/webpack/tree/master/examples/dll, 但在实际的操作中,dllPlugin的操作还是相对比较麻烦,不能达到一个完全的解耦状态,webpack为了做版本隔离,做了比较复杂的方案,但在项目实践中除了更麻烦意外实用性并不强。
  2. 自己构建commonJS模块,然后通过require.js做加载器,这样项目代码,外部库都是作为common.js库,然后另外在页面写代码初始化。这样的方案也比较麻烦
  3. 自己构架全局变量模块,这是相对来说,比较简单,也是本文中讨论的方案。以下就这种方法做详细讨论:
如何构建外部库
  1. 新建一个项目,然后新建index.js
    然后里边引入我们需要构建的公共库;

示例代码如下:

exports.react = require('react');
exports.reactDom = 'react-dom');
exports.reactRedux = 'react-redux');
exports.reactRouter = 'react-router');
exports.reactRouterRedux = 'react-router-redux');
exports.redux = 'redux');
exports.reduxThunk = 'redux-thunk');
exports.reactAddonsTransitionGroup = 'react-addons-transition-group');
  1. 配置webpack.config.js
entry: {
        "index": srcPath
    },output: {
        path: outputPath,filename: '[name].js',library: 'MY_LIB',//这个是全局的变量名
        libraryTarget: 'umd'  //这里写umd,也为了后期兼容其他模式
    },

3.构建和发布

把构建好的js发布上线,

如何在项目中引入这个库

  1. 在项目的html页面头部引入这个js。
    比如
<script src="http://g.alicdn.com/my.js"></script>
  1. 配置webpack.config.js

主要是增加一个externals的配置,这样配置,构建出来的代码将不会包含相关的模块

externals: [{
        'react': 'window.MY_LIB.react','react-dom': MY_LIB.reactDom',114)">'redux': MY_LIB.redux',114)">'react-redux': MY_LIB.reactRedux',114)">'redux-thunk': MY_LIB.reduxThunk',114)">'react-router': MY_LIB.reactRouter',114)">'react-router-redux': MY_LIB.reactRouterRedux',114)">'react-addons-transition-group': MY_LIB.reactAddonsTransitionGroup'
    }],
  1. 大功告成。

再重新构建一次,就会发现速度飞快了。

总结

经过几步简单的修改,对项目的速度提升非常明显。

  1. 经测试, 在用这种方式构建以后,项目构建速度提高50%以上,依据项目中的外部库而定。
  2. 用户在第二次升级的加载中,加载速度也提升了30%以上。
    3.如果用的库和这个项目的一样,那么可以直接从CDN引入,而不需要再次构建,达到跨项目的重用。

点击有惊喜

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom