webpack_01_基础配置

官方文档

安装
//在指定文件夹中打开命令行
mkdir webpackX
npm init -y
//初始化package.json文件

在这里插入图片描述

//安装webpack和webpack-cli
npm i webpack webpack-cli -D
//其中 i = install ; -D = --save-dev

在这里插入图片描述

打包配置1

在根目录下新建 webpack.config.js (名字自己取),同时建src文件夹及其下面index.js文件

 webpack.config.js
//由于webpack是基于node的,所以使用它的路径模块
const path = require('path')

module.exports = {
	//入口:分单页入口和多页入口
	entry:{
		index:'./src/index.js'
	},
	//出口
	output:{
		//打包出来的文件名称
		filename:'bundle.js',
		
		//打包出来的对应磁盘位置 dist文件夹下
		path:path.resolve(__dirname,'dist')  
	},
	//模式是在webpack4出来的有三个参数production,development,none具体参考文档看区别
	mode:'production',
}
index.js
document.write('123456')

到此我们基础设置完成了 可以测试打包了 命令行键入

./node_modules/.bin/webpack

在这里插入图片描述
可以看到如下图一样在dist下面生成了我们在output里面所指定的filename文件
在这里插入图片描述
再在dist下新建index.html 里面引入bundle.js 打开浏览器
在这里插入图片描述

修改为Script命令执行打包

在上面我们是在命令行中输入 ./node_moudles/.bin/webpack执行的打包,其实我们可以把提取出来 放在package.json中的“script”配置里面 因为这个script关联的就是node_moudles文件夹下面的.bin文件夹
在这里插入图片描述
现在我们直接在命令行中 执行 npm run build
在这里插入图片描述

添加loader支持es6 es7

webpack开箱时只支持js和json,所以其他的文件都需要loader来帮忙解析,我们修改配置文件中的module,在rules这个数组中配置babel-loader,但是首先需要安装babel-loader。

需要安装babel-core,babel-preset-env babel-loader

 npm i @babel/core @babel/preset-env babel-loader -D

在这里插入图片描述
配置babel需要在当前根目录前创建“.babelrc”配置文件(具体参考babel)
这里为了测试也安装了react,react-dom babel-preset-react

.babelrc
{
    "presets":[
        "@babel/preset-env",
        "@babel/preset-react"
    ]
}

在这里插入图片描述

 webpack.config.js
//由于webpack是基于node的,所以使用它的路径模块
const path = require('path')

module.exports = {
	//入口:分单页入口和多页入口
	entry:{
		index:'./src/index.js'
	},
	//出口
	output:{
		//打包出来的文件名称
		filename:'bundle.js',
		
		//打包出来的对应磁盘位置 dist文件夹下
		path:path.resolve(__dirname,'dist')  
	},
	//模式
	mode:'production',
	
	//loaders
	module:{
		rules:[
			test:/\.js$/,                   //匹配以.js结尾的文件
			use:'babel-loader'       //对其使用babel-loader
		]
	}
}

现在在index.js中写react 再打包将其编译

index.js

import React from "react";
import ReactDom from "react-dom";

class Test extends React.Component {
  render() {
    return <h1 className="test">我是react</h1>;
  }
}

ReactDom.render(<Test />, document.getElementById("root"));

执行完build后 同样在dist中新建index.html引入bundle.js且建个id为root的元素 打开浏览器
在这里插入图片描述

添加loader支持css

安装css-loader,为了打包直接看到效果 我们可以再安装一个style-loader,它是匹配css文件打包进style标签再添加到head标签里面

npm i css-loader style-loader -D

在配置文件中添加loader

webpack.config.js
//由于webpack是基于node的,所以使用它的路径模块
const path = require('path')

module.exports = {
	//入口:分单页入口和多页入口
	entry:{
		index:'./src/index.js'
	},
	//出口
	output:{
		//打包出来的文件名称
		filename:'bundle.js',
		
		//打包出来的对应磁盘位置 dist文件夹下
		path:path.resolve(__dirname,'dist')  
	},
	//模式
	mode:'production',
	
	//loaders
	module:{
		rules:[
			{	
				test:/\.js$/,                   //匹配以.js结尾的文件
				use:'babel-loader'       //对其使用babel-loader
			},
			{
				test:/\.css$/,
				use:[
						//链式解析 从右到左 先使用css-loader解析 然后传递给style-loader解析
						'style-loader',
						'css-loader' 
				]
			}
		]
	}
}

在src下新建index.css

index.css

color:blue

在这里插入图片描述
执行打包 访问index.html会看到蓝色字体

添加loader支持less/sass

同样需要安装 less 和 less-loader

npm i less less-loader -D
webpack.config.js
//由于webpack是基于node的,所以使用它的路径模块
const path = require('path')

module.exports = {
	//入口:分单页入口和多页入口
	entry:{
		index:'./src/index.js'
	},
	//出口
	output:{
		//打包出来的文件名称
		filename:'bundle.js',
		
		//打包出来的对应磁盘位置 dist文件夹下
		path:path.resolve(__dirname,'dist')  
	},
	//模式
	mode:'production',
	
	//loaders
	module:{
		rules:[
			{	
				test:/\.js$/,                   //匹配以.js结尾的文件
				use:'babel-loader'       //对其使用babel-loader
			},
			{
				test:/\.css$/,
				use:[
						//链式解析 从右到左 先使用css-loader解析 然后传递给style-loader解析
						'style-loader',
						'css-loader' 
				]
			},
			{
				test:/\.less$/,
				use:[
					'style-loader',
					'css-loader',
					'less-loader'
				]
			}
		]
	}
}
添加loader支持字体和图片

安装file-loader或者url-loader

npm i file-loader url-loader -D
//继续在rules数组里面添加对象
			//file-loader解析图片
            {
                 test:/\.(png|jpg|gif|jpge)$/,
                 use:'file-loader'   //解析文件  这里也可以使用url-loader
            },

            //file-loader解析字体
            {
                test:/\.(woff|woff2|eot|ttf|otf)$/,
                use:'file-loader'
            },

            //url-loader解析图片
            {
                test:/\.(png|jpg|gif|jpge)$/,
                use:[
                    {
                        loader:'url-loader',
                        options:{
                            limit:10240  //10K 小于10K 作baes64处理
                        }
                    }
                ] 
            }
设置webpack watch监听文件改动

这个基础功能是为了我们修改了文件 会及时打包 缺点就是需要手动去刷新页面才能看到效果

package.json

scripts:{
	"watch":"webpack --watch"
}
命令行执行npm run watch 开始监听文件
设置server 热更新

由于上面的watch方式每次需要手动去刷新页面,webpack提供插件来热更新

//安装web-dev-server
npm i web-dev-server -D
webpack.config.js

const webpack = require('webpack')
//添加plugins插件,同时设置devServer
    plugins:[
        new webpack.HotModuleReplacementPlugin(),  //WDS  热更新插件
    ],
    devServer:{
		contentBase:'./dist',
		hot:true,
		port:9527  //监听端口 http://localhost:9527
	}
    
设置js文件指纹

一般我们生产环境使用的打包代码都是一长串的字符串 所以我们常见的开发配置,使用了两个配置文件,一个是开发环境,一个是生产环境。新建两个文件webpack.prod.js(生产配置) webpack.dev.js(开发环境)

package.json

"scripts":{
	"build":"webpack --config webpack.prod.js",
	"dev":"webpack --config webpack.dev.js --open"
}

在这里插入图片描述
文件指纹我们一般使用在生产环境,只需要更改配置文件中的output输出项

webpack.prod.js

//单入口
    entry:{
        index:'./src/index.js',
    },

    //出口
    output:{
        //这里的[name]类似占位符(指在上面entry配置的对象的key值 即"index"),若没有则默认为"main",js的指纹设置 chunkhash 只能在生产环境中使用
        filename:'[name]_[chunkhash:8].js',  //js 一般使用chunkhash

        path:path.resolve(__dirname,'dist')  //打包出来的对应磁盘位置
    },

在这里插入图片描述

设置css文件指纹

前面我们使用的是style-loader打包进head标签里面,其实我们一般是单独打包css文件,这里需要用到插件

npm i mini-css-extract-plugin -D
webpack.prod.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin')
plugins:[
        new MiniCssExtractPlugin({
            filename:'[name]_[contenthash:8].css'  //这里来指定 css一般使用contenthash
        })
   ],

同时不再使用style-loader,使用刚刚新增的插件的loader
在这里插入图片描述

设置压缩css,js,html
压缩js 可以使用内置的 uglifyjs-webpack-plugin插件 但是在webpack4后 如果mode设置成production 会默认启用压缩js

//压缩css 需要插件 optimize-css-assets-webpack-plugin && cssnano(处理器)
npm i optimize-css-assets-webpack-plugin cssnano -D

//压缩单文件html 需要插件 html-webpack-plugin 和 依赖cssnano
npm i html-webpack-plugin cssnano -D
webpack.prod.js
plugins:[
		//压缩css
		new optimizeCssAssetsWebpackPlugin({
             assetNameRegExp:/\.css$/g,
             cssProcessor:require('cssnano')
         }),
		
		//压缩html
         new HtmlWebpackPlugin({
             template:path.join(__dirname,'src/index.html'),   //应用的模板
             filename:'index.html',   //名称
             chunks:['index'],  //打chunks
             inject:true,
             minify:{
                 html5:true,
                 collapseWhitespace:true,
                 preserveLineBreaks:false,
                 minifyCSS:true,
                 minifyJS:true,
                 removeComments:false
             }
         })
]

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值