02---webpack基础用法

01 entry打包的入口文件:
javascript 复制代码
单入口entry是一个字符串:适用于单页面项目

module.exports = {

    entry:'./src/index.js'

}


多入口entry是一个对象

module.exports = {

    entry:{

        index:'./src/index.js',

        app:'./src/app.js'

    }

}
02 output打包的出口文件:
javascript 复制代码
单入口配置

module.exports = {

    entry:'./src/index.js'

    output:{

    path:path.resolve(__dirname,'dist'),


    filename:'bundle.js'
}

}

多入口的配置 需要通过站位符【name】来进行站位,相当于是在dist输出两个出口的文件

module.exports = {

    entry:{

        app:'./src/app.js',

        index:'./src/index.js'
    }

    output:{

    path:path.resolve(__dirname,'dist'),


    filename:'[name].js'
}

}
03 loaders:webpack只支持js和json文件类型,loaders需要把其他文件进行转化为有效的模块
javascript 复制代码
const path = require('path')

module.exports = {

 module:{

    rules:[  test指定对应的规则  use加载对应的loader

        {test:/\.txt$/,use:'raw-loader'}

    ]

 }

}
04 plugin插件的配置:
javascript 复制代码
const path = require('path')

module.exports = {

    plugins:[  放到plugins的数组中

        new HtmlWebpackPlugin(

            {template:'./src/index.html'}
        
        )
    ]

}
05 modu:用来指定当前的构建环境:production development node
javascript 复制代码
mode模式默认为production

设置 process.env.NODE_ENV的值为 development.开启NamedChunksPlugin和NamedModulesPlugin

设置 process.env.NODE_ENV的值为 production.开启FlagDependencyUsagePlugin 

,FlagIncludedchunksPluginModuleConcatenationPlugin 

,NoEmitOnErrorsPlugin0ccurrenceOrderPlugin,sideEffectsFlagPlugin和TerserPlugin。

none:不开启任何优化选项
06 解析ES6以及React JSX语法:
javascript 复制代码
解析ES6---需要安装npm install @babel/core  @babel/preset-env  babel-loader -D
 
webpack.config.js配置 

modele.exports = {

    module:{

        rules:[

            {test:/\.js$/,use:'babel-loader'}
        
        ]

    }

}

bebel的配置文件是.babelrc 

{

    "presets":["@babel/preset-env"],

    "plugins":["@babel/proposal-class-properties"]
}



解析react jsx的语法: 需要再安装 npm i @babel/preset-react:

在 .babelrc文件中增加@babel/preset-react

{

    "presets":["@babel/preset-env","@babel/preset-react"],

    "plugins":["@babel/proposal-class-properties"]
}
07 react使用的案例 : 需要安装react react-dom插件, src创建search.js文件
javascript 复制代码
search.js文件代码如下

import React from 'react'

import ReactDom from 'reacr-dom'

class Search extends React.Component {

   render(){

        return {


            <div>我是react</div>
        }

}

}

RactDom.render(<Search/>,document.getElementById('root'))

再执行 npm run build的命令 在dist目录下会创建出一个search.js文件,index.html页面中引入文件

javascript 复制代码
<html>

    <body>

        <div id='root'></div>

        <script src='./dist/search.js'></script>
    
    </body>

</html>
08 解析css与less,需要使用style-loader css-loader less-loader
javascript 复制代码
module.exports = {

 module:{

    rules:[


        {test:/\.css$/,use:['style-loader','css-loader']},

        {test:/\.less$/,use:['style-loader','css-loader','less-loader']}
        
    ]
  }

}
09 解析图片与字体资源
javascript 复制代码
module.exports = {

 module:{

    rules:[


        {test:/\.(png | svg | jpg | gif)$/,use:['file-loader']},

            
        {test:/\.(woff | woff2 | eot | ttf | otf)$/,use:['file-loader']}

        
         // 这里是解析base64        

        {test:/\.(png | svg | jpg | gif)$/,use:[{loader:'url-loader',options:  
       
        {limit:10240}}]},
        
    ]}
        
    ]
  }

}
10 webpack中的文件监听:源码发生变化 自动构建输出新的文件;
javascript 复制代码
1 第一种 在package.json文件中: 缺点 还需要自己手动刷新浏览器

"build":"webpack --watch"

2 第二种  在webpack.config.js中设置  

  module.exports = {

    watch:true, 

    watchOptions:{
 
         ignored:/node_modules, 

         aggregateTimeout:300,  监听到变化发生后300ms后再去执行
        
         poll:1000  判断文件是否发生变化 默认美妙访问1000次
   
    }

  }
11 webpack热更新。代码更新后会自动刷新浏览器不用手动刷新,需要借助webpack-dev-server
javascript 复制代码
在package.json文件中进行配置:

"scripts":{

 "dev":"webpack-dev-server --open"

}

在webpack.config.js文件中配置

const webpack = require('webpack')

plugins:[

    new webpack.HotModuleReplacementPlugin()
],

devServer:{
 
 contentBase:'./dist',

 hot:true

}
12 文件指纹:打包输出的文件名会有一个后缀:<src="index_0123223db.js?bid=123">
javascript 复制代码
hash:和整个项目的构建有关,只要项目文件有修改,整个项目构建的hash值会更改

chunkhash:和webpack打包的chunk有关 不同的entry会生成不同的chunkhash值

contenthash:根据文件内容来定义hash 文件内容不同contenthash不变

使用的方法 

js使用chunckhash  css使用contenthash  图片使用hash

modulle.exports = {

output:{

    filename:`[name]_[chunckhash:8].js`,

    path:__dirname+'/dist'
 
  },

plugins:[

    new MiniCssExtractPlugin({

        filename:`[name]_[contenthash:8].css`
    })
],

module:{

    rules:[

        {test:/\.(png | svg | gif)$/, use:[{loader:'file-loader', options:{name:`img/[name]_[hash:8].[ext]`}}]}
    ]

}

}

这里需要注意的是如果是要在dist目录下输出单独的css文件 需要将use:['style-loader'换成MiniCssExtractPlugin.loader]
13 代码压缩[html,css,js]
javascript 复制代码
webpack内置了uglifyjs-webpack-plugin插件,打包后的代码会自动压缩js代码。


html的压缩:修改html-webpack-plugin 设置压缩的参数

module.exports = {

    entry:'./src/index.js',

    output:{

    path:__dirname+'/dist',

    filename:'[name]_[chunkhash:8].js'

    },

    plugins:[

        new HtmlWebpackPlugin({

            template:path.join(__dirname,'src/search.html'),

            filename:'search.html',

            chunks:['search'],

            inject:true,

            minify:{

                html5:true,

                collapseWhitespace:true,

                preserveLineBreaks:false,

                minifyCSS:true,

                minifyJS:true,

                removeComments:false

            }

        })

    ]

}



css的压缩需要使用optimize-css-assets-webpack-plugin和cssnano

module.exports = {

    entry:'./src/index.js',

    output:{

    path:__dirname+'/dist',

    filename:'[name]_[chunkhash:8].js'

    },

    plugins:[

        new OptimizeCssAssetsPlugin({

            assetNameRegExp:/\.css$g/,

            cssProcessor:require('cssnano')

        })

    ]

}
14 自动清理构建目录产物 :每次构建的时候还需要手动的删除dist目录下的文件
javascript 复制代码
借助与webpack的clean-webpack-plugin的插件每次构建可以自动删除dist目录的文件

module.exports = {

 plugins:[

        new CleanWebpackPlugin()
    
    ]

}
相关推荐
知孤云出岫几秒前
web 渗透学习指南——初学者防入狱篇
前端·网络安全·渗透·web
贩卖纯净水.6 分钟前
Chrome调试工具(查看CSS属性)
前端·chrome
栈老师不回家1 小时前
Vue 计算属性和监听器
前端·javascript·vue.js
前端啊龙1 小时前
用vue3封装丶高仿element-plus里面的日期联级选择器,日期选择器
前端·javascript·vue.js
一颗松鼠1 小时前
JavaScript 闭包是什么?简单到看完就理解!
开发语言·前端·javascript·ecmascript
小远yyds1 小时前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
阿伟来咯~2 小时前
记录学习react的一些内容
javascript·学习·react.js
吕彬-前端2 小时前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱2 小时前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
guai_guai_guai3 小时前
uniapp
前端·javascript·vue.js·uni-app