随着项目的增大,项目运行速度会越来越慢,导致影响开发进度。需要提升开发时代码的运行速度。

1. ScopeHoisting作用域提升

该插件在production模式下默认开启。development下需要手动启动。

1 .使用条件

和TreeShaking一样,必须使用ES6的模块,使用import/export语法。

2. 优点:

1)节省内存开销。因为默认每个bundle会打成闭包。

2)减少体积,提升速度。因为如果不使用es模块,默认会包裹一层require。

3. 用法

1. 首先阻止babel将es6的模块进行转换

  1. {
  2. test: /\.jsx?$/,
  3. use: {
  4. loader: 'babel-loader',
  5. options: {
  6. // 切记modules: false
  7. presets: [['@babel/preset-env', {modules: false}], '@babel/preset-react'],
  8. plugins: [
  9. ['@babel/plugin-proposal-decorators', {legacy: true}],
  10. ['@babel/plugin-proposal-class-properties', {loose: true}]
  11. ]
  12. },
  13. },
  14. exclude: /node_modules/
  15. }

2. 引入的第三方库尽量使用es版本

3. 在plugins中配置插件

  1. plugins: [
  2. new webpack.optimize.ModuleConcatenationPlugin(),
  3. ]

4. node_modules中的模块优先使用指向es模块的文件

  1. resolve: {
  2. mainFields: ['jsnext:main', 'browser', 'main']
  3. },

2. 热更新

当项目特别大时,页面重新加载会非常缓慢,可以通过热更新,只更改修改的部分。

1. sevServer中开启热更新

  1. module.exports = {
  2. ...
  3. devServer: {
  4. hot: true //默认开启webpack.HotModuleReplacementPlugin
  5. }
  6. }

2. css样式热更新

开发模式下使用style-loader, 默认实现了HMR。(css-hot-loader在hot:true时有问题)

  1. {
  2. test: /\.css$/,
  3. use: [
  4. 'style-loader',
  5. 'css-loader'
  6. ]
  7. },

3. jsx代码热更新

使用react-hot-loader插件,在需要的模块包裹hot函数。

  1. {
  2. test: /\.jsx?$/,
  3. use: {
  4. loader: 'babel-loader',
  5. options: {
  6. presets: [['@babel/preset-env', {modules: false}], '@babel/preset-react'],
  7. plugins: [
  8. ['@babel/plugin-proposal-decorators', {legacy: true}],
  9. ['@babel/plugin-proposal-class-properties', {loose: true}],
  10. ['react-hot-loader/babel']
  11. ]
  12. },
  13. },
  14. exclude: /node_modules/
  15. },

在代码中使用hot方法

  1. import React from 'react';
  2. import { hot } from 'react-hot-loader/root';
  3.  
  4. function Test(props) {
  5. return(
  6. <div className="hehe">ppp</div>
  7. )
  8. }
  9.  
  10. export default process.env.NODE_ENV === 'development' ? hot(Test) : Test;

也可以不使用该插件,自己实现逻辑

  1. // 尽量在子组件实现该逻辑;它不接受css文件的变化
  2. if(module.hot) {
  3. module.hot.accept(['./example.js'], () => {
  4. ReactDOM.render(<App/>, window.root)
  5. })
  6. }

webpack开发环境速度优化的更多相关文章

  1. 分离Webpack开发环境与生产环境的配置

    这是Webpack+React系列配置过程记录的第五篇.其他内容请参考: 第一篇:使用webpack.babel.react.antdesign配置单页面应用开发环境 第二篇:使用react-rout ...

  2. 从零开始配置TypeScript + React + React-Router + Redux + Webpack开发环境

    转载请注明出处! 说在前面的话: 1.为什么不使用现成的脚手架?脚手架配置的东西太多太重了,一股脑全塞给你,我只想先用一些我能懂的库和插件,然后慢慢的添加其他的.而且自己从零开始配置也能学到更多的东西 ...

  3. 从0构建webpack开发环境(一) 一个简单webpack.config.js

    本文基于webpack4.X,使用的包管理工具是yarn 概念相关就不搬运了,直接开始 首先项目初始化 mkdir webpack-demo && cd webpack-demo ya ...

  4. webpack开发环境配置和生产环境配置

    开发环境配置 在开发环境下,我们首先考虑的是方便开发,方便代码调试,不需要考虑代码合并和css样式分离这些. 这里主要说三个 :1.css模块化:2.模块热替换功能:3.source-map(代码映射 ...

  5. webpack 开发环境与生成环境的 配置

    写在前面 最近学习react,之前做vue项目的时候,一直都是拿来主义,浑浑噩噩,感觉不太好,趁学习react的机会,在顺带学习一下webpack.一般配置文件分两份,为开发环境和生成环境.有此区分, ...

  6. 从0构建webpack开发环境(三) 开发环境以及 webpack-dev-server 的使用

    sourceMap 实际应用开发过程中大部分时间都是处于开发模式中,其中需要频繁的修改代码.调试和打包. 但是打包后的代码多个模块压缩到了一个bundle文件,如果出现警告或者异常很难定位到具体模块和 ...

  7. react+webpack开发环境配置

    react是目前非常热门的前端框架,提倡组件化开发.所谓的组件,简单理解,就是一个独立的页面部件(包括页面模版,样式,逻辑等),它是一个独立的整体. webpack,是一个模块打包工具,其主要功能,就 ...

  8. vue2+webpack 开发环境配置

    前提条件: 1.安装node.js https://nodejs.org/en/ 下载安装合适的平台 2.安装npm 第一步:初始化项目 新建文件夹 E:\app 推荐vue项目目录结构: confi ...

  9. webpack开发环境和生产环境切换原理

    在package.json中有如下设置: "scripts": {    "dev": "node build/dev-server.js" ...

随机推荐

  1. magicbook 踩坑

    新买了 magicbook pro 16.1寸的荣耀笔记本,在使用过程中发现了一些问题. 电脑详情 规格: magicbook pro 16.1 cpu: 锐龙 R5 操作系统: deepin 15. ...

  2. C#中关于常用日期的计算

    void Main() { DateTime dt = DateTime.Now; //当前时间 DateTime startWeek = dt.AddDays( - Convert.ToInt32( ...

  3. jquery获取窗口和文档的高度和宽度

    整个可视区域的宽度和高度(会随着浏览器窗口大小改变而改变): $(window).width()和$(window).height() 整个文档的宽度和高度(不变): $(docoument).wid ...

  4. 7 批量查询mget、批量修改bulk

    注意:当执行多条数据查询.增删改时,一定要用mget.bulk,提升性能,减少网络传输   mget   回顾:查询单个文档 GET /beauties/my/2   mget 查询多个文档: 不同 ...

  5. Mac 达芬奇【Davinci Resolve】 无法添加媒体

    参考 : https://zhidao.baidu.com/question/182613491787331404.html 打开软件,点击默认的未命名项目: 点击左上角图中箭头位置: 选中系统-&g ...

  6. 【转载】C#中使用List集合的Insert方法在指定位置插入数据

    在C#的List集合等数据类型变量中,我们可以使用List集合的Insert方法在指定的索引位置插入一个新数据,例如指定在List集合的第一个位置写入一个新数据或者在List集合的中间某个位置插入个新 ...

  7. 3.建造模式(Builder)

    注:图片来源于 https://www.cnblogs.com/-saligia-/p/10216752.html 建造模式UML图解析: 代码: Director.h // // Created b ...

  8. 1+X证书学习日志 —— css样式表

    ## 因为初级的内容较多,所以选了一些有用的 需要记忆的内容写下 方便日后回顾 CSS语法   选择符{属性:属性值;} ##             所有的css代码 都要放在css样式表里面    ...

  9. javasript简单实现文字的展开收起(无动画)

    今天在工作遇到展开和收起的需求,在网上找了很多方法,今天来写一下我觉得比较简单的方法 在项目中需要达到如图这种效果 首先想的是使用overflow简单且粗暴,在需要展开的的文字定义样式 { overf ...

  10. Oracle 操作数据库(增删改语句)

    对数据库的操作除了查询,还包括插入.更新和删除等数据操作.后3种数据操作使用的 SQL 语言也称为数据操纵语言(DML). 一.插入数据(insert 语句) 插入数据就是将数据记录添加到已经存在的数 ...