webpack及react的搭配使用(一)

准备工作

目前webpack作为目前国内最火的打包及加载工具之一,经常在react工程中使用,接下来我们来详细了解下webpack的使用姿势
在接下来的操作步骤之前,需要先配置修改react工程下的package.json,增加devDependencies如下:
"css-loader": "^0.23.1",
"extract-text-webpack-plugin": "^1.0.1",
"less-loader": "^2.2.2",
"portfinder": "^0.4.0",
"react-hot-loader": "^1.3.0",
"style-loader": "^0.13.0",
"webpack": "^1.12.9",
"webpack-dev-server": "^1.14.0",
"react": "^0.14.0",
"react-dom": "^0.14.0",
"react-router": "^2.0.0-rc5"

然后根据package.json使用npm install安装依赖包,接下来就要开始我们的webpack之旅

  • 其中react的工程文件结构为
    • project
      • demo01
      • index.html
      • main.js
      • components
        • list.js
      • webpack.config.js
  • 工程文件具体内容(除 webpack.config.js之外)就不再赘述,网上均有类似内容,然后执行webpack,会出现webpack:command not found的错误提示,经资料查证,方法之一需在~/.bash_profile中添加如下设置: export NODE_PATH=”/usr/local/lib/node_modules,然而这个并不现实(并不是全局安装的webpack),方法之二是在package.json中加入
    “scripts”: {
    “build”: “webpack”
    }
    然后执行npm run build 即可实现webpack操作,接下来我们需要详细分析下webpack.config.js配置文件可以包含哪些内容~

webpack.config.js配置详解

  • 最为基础的有以下几项:

    • entry: 定义了打包的入口文件,数组中的所有文件会按顺序打包并寻找相关依赖(webpack建议使用commonJS的方式引入及定义依赖),数组数大于一经常是为多页面工程设计所需
    • output: 定义输出文件的位置,常用参数有:
    • path: 打包文件存放的绝对路径
    • publicPath: 网站运行时的访问路径
    • filename: 打包后的文件名
      如图为我们最原始的webpack.config.js文件

      此时执行npm run build,则并不会在demo01文件夹下生成build/bundle_1.js,而是会报出You may need an appropriate loader to handle this file type这样的红色错误,这是因为我们用了react!!! 没有相关的预处理怎么可以,这也是webpack最为强大的地方,图片,js,css等均可通过loader的方式引入进来

    • {
      module: {
      loaders: [
      { test: /.js$/,loader: “react” }
      ]
      }
      }
      其中test正则匹配所需处理文件,loader为所需加载器,那如果需要多个loader去处理这些文件呢,我们可以将其中的loader替换成 loaders: [‘babel?presets[]=react,presets[]=es2015’] 其中presets后的为预处理工具,辅助babel处理第二步的transform过程,详细可见babel官网 (当使用loaders则不可再使用query选项)
      那么此时执行npm run build 便会执行webpack打包过程,接下来我们谈谈webpack其他配置项

升级配置项及优化性能

  • debug:debug模式开始,webpack该配置项共有七种,有inline-source-map,debug等,目前我采用devtool: ‘#source-map’方式(仅在开发时使用,影响性能)
  • output: 通过配置output.libraryTarget,可以自定义输出的模块类型,包括AMD,CommonJS,变量等,通过设置library,可以定义其模块名称
  • plugins: 引入对应插件,插件列表在webpack官网可搜索到,其中较为主要的几个有:

    • new webpack.optimize.CommonsChunkPlugin,该插件的引入可抽离文件的公共部分,譬如entry有 vendor: [“jquery”,“underscore”,…]的相关依赖时,我们可通过把全部vendor依赖打包在vendor.bundle.js中
      当entry存在多个文件需要打包时,使用CommonsChunk插件可将多个文件中的公共部分抽取出来,实现按需加载及缓存,提升页面性能
    • new webpack.optimize.LimitChunkCountPlugin({maxChunks: 15}),new webpack.optimize.MinChunkSizePlugin({minChunkSize: 10000})为第一个的优化项,限制chunk的数目及chunk的最小大小,防止盲目的抽取公共部分,进而提高性能~
    • new webpack.optimize.UglifyJsPlugin()和uglifyjs类似,压缩对应的js文件,如果使用css loader,则也可以压缩css文件
    • extract-text-webpack-plugin实现css文件的单独抽离,而不是均包含在最终生成的 js文件中,有三种配置方式 ,new ExtractTextPlugin(“[name].css”)将每个entry下的css抽离成多个文件,
      new ExtractTextPlugin(“style.css”,{
      allChunks: true
      })则将全部css文件合成一个,如若配合CommonsChunkPlugin使用,则可实现和CommonsChunkPlugin同样的css效果~
  • resolve: 其中最常用的有alias及 extensions,其中alias作用为别名定义,可定义webpack打包的文件别名(防止长文件的多次书写),譬如 alias下定义moment: “moment/min/moment-with-locales.min.js”,后期便可使用require(‘moment’)得到moment-with-locales.min.js文件,同时譬如我们不需要引入node_modules的react的全部,而只需引入下面的部分react.min.js,则也可以通过react别名定义,重写其查找路径,从而减少其打包时间,’react’:’react/dist/react.min.js’
    extensions则自动扩展文件后缀名,意味着我们require模块可以省略不写后缀名

    总结与反思

  • 以前看网上教程一直以为是蛮简单的一件事,但当自己全部重头做起及优化还是一件比较费脑筋的事情,官网尽管是英文的而且内容繁杂,但是官网往往是最靠谱的(当然官网内容仍不是很完全,从babel-loader的github介绍上我们也可找出关于webpack的不少优化项,可以下周再续)

  • 本来还有react-hot-loader这个利器需要加进来,但限于篇幅,下周再续

    • 绝大多数是总结项目经验及网上教程,官网而来,也许有纰漏或不准确的地方,希望后期会更正

    更新

    • 刚刚看到一篇很好的webpack文章,里面有很多补充优化了本文提到的webpack配置,http://www.jb51.cc/article/p-aunnrtsl-c.html 参考
    • https://github.com/babel/babel-loader 参考自babel-loader官网,里面的 query: { presets: [‘es2015’],plugins: [‘transform-runtime’] }中的plugins可以减少文件的依赖次数,可以起到优化性能的作用,而 loader: ‘babel?cacheDirectory’的cacheDirectory则可以实现loader结果的缓存~,也可以起到优化性能的作用,但仅限于该babel-loader

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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