react+webpack项目常用的插件(plugins)

一、HtmlWebpackPlugin使用:

npm install html-webpack-plugin --save-dev

解释:这个插件是简化创建生成html(h5)文件用的,如果你引入的文件带有hash值的话,这个尤为的有用,不需要手动去更改引入的文件名!

生成的是index.html,基本用法为:

var HtmlWebpackPlugin = require('html-webpack-plugin');
var webpackConfig = {
  entry: 'index.js',output: {
    path: 'dist',filename: 'index_bundle.js'
  },plugins: [new HtmlWebpackPlugin()]
};

js通过script的标签引入到body中!
如果你使用了ExtractTextPlugin来提取css,将通过link在head中引入!

一般配置:

title: 用于生成的HTML文档的标题,也就是html,head中`<title>ceshi</title>`
filename: 生成文件名,default index.html
template: 模版(填写相对路径,与配置文件的相对路径,例如:'./index.html'
hash: 增加hash值,使每次生成的都是唯一的不重复的

二、ExtractTextWebpackPlugin 分离我们的样式文件,例如css,sass,less

npm install --save-dev extract-text-webpack-plugin

基本用法

const ExtractTextPlugin = require("extract-text-webpack-plugin");

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,use: ExtractTextPlugin.extract({
          fallback: "style-loader",use: "css-loader"
        })
      }
    ]
  },plugins: [
    new ExtractTextPlugin("styles.css"),//输出在根目录上,也可以这样写css/styles.css
  ]
}

其中plugins中的参数配置有:(string/object) id: 插件实例的唯一标识,认情况下是自动生成的,不建议设置
filename: 生成文件名称,可以包含[name],[id] and [contenthash]
allChunks:(bollean) 从所有附加块中提取认情况下,它仅从初始块中提取

rules里面的参数配置有:(loader | object) options.use :
{String}/{Array}/{Object} 使用的编译loader options.fallback :
{String}/{Array}/{Object} 当css没有被提取的时候,可以当作保守用 options.publicPath :
可以覆盖output里的publickPath

如果想生成多个css文件的话,可以这样写:

const ExtractTextPlugin = require('extract-text-webpack-plugin');

const extractCSS = new ExtractTextPlugin('css/[name]-one.css');
const extractLESS = new ExtractTextPlugin('css/[name]-two.css');

module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,use: extractCSS.extract([ 'css-loader','postcss-loader' ])
      },{
        test: /\.less$/i,use: extractLESS.extract([ 'css-loader','less-loader' ])
      },]
  },plugins: [
    extractCSS,//两个实例
    extractLESS
  ]
};

三、DefinePlugin 定义变量

允许我们创建可在编译时配置的全局常量,这对与需要灵活配置的项目而言非常的重要,举个例子:
开发中我们需要devtool来查看redux树中stroe中的变量,但是生产环境中不需要,那么就可以这样定义:

const nodeenv = process.env.NODE_ENV || 'development';
const isPro = nodeenv === 'production';
new webpack.DefinePlugin({
    "__dev__": JSON.stringify(isPro) 
})

那么在开发环境中__dev__为false,
打包的时候可以在CLI中输入NODE_ENV=production 这样__dev__就为true;

四、ProvidePlugin 提供识别码

通俗点讲就是使用一些字符代替复杂的字符,例如我想用 $ 代表 jquery,那么就可以使用这个插件,或着我想用 'av' 代表 './ateon/values' 这个路径,也可以使用这个插件

基本用法

new webpack.ProvidePlugin({
  $: 'jquery',jQuery: 'jquery','av' : './ateon/values'
})

在模块中使用,import lives from 'av' === import lives from './ateon/values'

五、clean-webpack-plugin 清除你的build目录

基本用法

const CleanWebpackPlugin = require('clean-webpack-plugin')

// webpack config
{
  plugins: [
    new CleanWebpackPlugin(paths [,{options}])
  ]
}
[,{options}]为可选参数
`path` An [array] of string
options 参数
{
root: __dirname,认根目录,也就是你的package的路径(绝对路径)
verbose: true,在控制台console日志
dry: false,认为false,删除所有的文件, 为true时,模拟删除,并不删除文件
watch: false,认false, 为true时删除所有的编译文件
exclude: [ 'files','to','ignore' ] 
}

一般这一项我们都使用认值,不去设置,只需要设置path就可以了!

总结,常用的就是这些了,后续还会在陆续的加入。。。其他相关插件

再次跟新一个插件,也是业务需求,将公用代码块独立打包,(六)

六、CommonsChunkPlugin 公用模块独立打包

说到这个,可以说很多用webpack项目的都会使用到这一插件,可以提升些许编译的速度。直接上demo吧!首先假设是一个react-webpack项目,那必然每次新建js的时候都会

import React,{PropTypes} from 'react';
import {ReactDOM} from 'react-dom';

将react和reactdom独立打包到一个文件,配置如下:

entry: {
      index: ‘main.js’,vendor : ['react','react-dom']  
},output: {
    chunkFilename:"[name].[hash:8].js",//用hash解决缓存的问题,
}


plugins: [
new CommonsChunkPlugin({ //对指定的chunks进行公共模块的提取 多个 html共用一个js文件(chunk),可用CommonsChunkPlugin
        names: ['vendor','manifest'],}),]

这个names一个数组,vendor对应的是entry上面的键值,必须一致,打包后就会在cli(命令行)中看到多一个vendor.js文件,如果启动文件必须先引入这个js才行,否则会报错!

那么这个manifest是为了解决vendor再次编译的问题,如果只是写了names:vendor,你可以仔细检查vendor后面的hash值的变化,在热更新的时候,每次更改js文件,都会重新编译,vendor也会重新编译(看看hash就知道了),按理说应该是不会更改了,因为我们就是用这个插件解决公用代码库不用每次都打包,提升编译速度的!解决的方案就是加一个这个,目前我也在找原因,找到了会及时过来更新的!

这个还有其他的参数配置,这里稍微解释一下参数的配置

{
name: string,//or   names: Array 对应entry上的键值
filename: string    生成文件的名字,如果没有认为输出文件名
minChunks: number|Infinity  模块被引用的次数多少才会被独立打包>=2
chunks: 表示需要在哪些chunk(也可以理解为webpack配置中entry的每一项)里寻找公共代码进行打包。不设置此参数则提取范围为所有的chunk
}

一般配置选项就是上面这些,

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