webpack使用详解
官网
官网:https://webpack.js.org
中文网:https://www.webpackjs.com
一、介绍
从webpack4.+进行介绍,会对Webpack常用配置一一讲解,各个功能点都有对应的详细例子,你如果能动手跟着本文中的例子完整写一次,你会觉得Webpack也不过如此。
1.1、webpack是什么
webpack是一种前端资源构建工具(模块打包器),一个静态模块打包器.在webpack看来,前端的所有资源文件(js/json/css/image/less/sass...)都会作为模块处理。它将根据模块的依赖关系进行静态分析,打包生成对应的静态资源。
从 v4.0.0 开始,webpack 可以不用再引入一个配置文件来打包项目,然而,它仍然有着高度可配置性,可以很好满足你的需求。
配置文件: webpack.config.js
1.2、webpack都能干些什么
1.3、webpack五个核心概念
- mode 模式 development / production ,来设置 mode 参数,你可以启用相应模式下的 webpack 内置的优化
- entry 入口 本项目应该使用哪个模块,来作为构建其内部依赖图的开始(指定打包入口文件)
- output 输出 在哪里输出它所创建的 bundles,以及如何命名这些文件,默认值为 ./dist
- loader loader 让webpack能够去处理那些非js文件(webpack自身只理解js)
- plugins 插件 则可以用于执行范围更广的任务。插件的范围包括,从打包优化和压缩,一直到重新定义环境中的变量。插件接口功能极其强大,可以用来处理各种各样的任务。
二、简单案例
2.1、准备工作
1、首先:webpack是运行在node环境中的,Node >= 8.10 和 npm >= 5.6(node环境链接:https://nodejs.org/en/ 直接下载电脑对应的版本即可。)
1、接下来新建项目文件夹这里我起名为:webpack_project
2、打开终端切换到项目文件夹下
3、执行命令初始化项目生成package.json: npm init -y
4、执行命令下载webpack与webpack-cli依赖: npm i -D webpack webpack-cli
npm init -y npm i -D webpack webpack-cli
tips:
install
可简写为 i
,
--global
可简写为 -g
,
--save-dev
可简写为 -D
--save
可简写为 -S
2、检查是否安装成功
这里注意一下版本 有些版本会遇到一些坑 , 若运行不起来,可以复制我这个版本放到对应的位置上, 然后npm i初始化一下
3、使用npx来完成本项目中的命令执行
npm webpack --version
4、在package.json文件中配置webpack运行脚本命令
执行命令 npm run build
2.2、新建
webpack_project 中创建src,dist文件夹,接下来再创建三个文件:
index.html --放在dist文件夹中; hello.js --放在src文件夹中; index.js --放在src文件夹中;
我们在index.html中写下html代码,它的作用是为了引入我们打包后的js文件: DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Webpack Projecttitle> head> <body> <div id='root'>div> <script src="bundle.js">script> body> html>
我们在hello.js中导出一个模块: // hello.js module.exports = function() { let hello = document.createElement('div'); hello.innerHTML = "Long time no see!"; return hello; };
然后在index.js中引入这个模块(hello.js): //index.js const hello = require('./hello.js'); document.querySelector("#root").appendChild(hello());
2.3 通过配置文件来使用webpack
在当前项目的根目录下新建一个配置文件webpack.config.js
,我们写下如下简单配置代码,目前只涉及入口配置(相当于我们的index.js
,从它开始打包)和出口配置(相当于我们打包生成的bundle.js
)。
// webpack.config.js
module.exports = {
mode:'development',
entry: __dirname + "/src/index.js", // 入口文件
output: {
path: __dirname + "/dist", //打包后的文件存放的地方
filename: "bundle.js" //打包后输出文件的文件名
}
}
//注:__dirname
是node.js中的一个全局变量,它指向当前执行脚本所在的目录,即C:\Users\sjt\DeskTop\webpack-project(这是我当前的目录)
但平时我们看到的脚手架配置也比较喜欢采用node.js的path
模块来处理绝对路径,所以我们也可以采用如下的写法,和上述的效果是一样的:
// webpack.config.js
const path = require('path');
module.exports = {
mode:'development', //开发环境
entry: path.join(__dirname, "/src/index.js"), // 入口文件
output: {
path: path.join( __dirname, "/dist"), //打包后的文件存放的地方
filename: "bundle.js" //打包后输出文件的文件名
}
}
//注:path.join
的功能是拼接路径片段。
扩展:这里再讲一下 filename 扩展写法
output: { //项目出口
path: path.resolve('dist'), // 打包生成路径 绝对路径
/*
打包名称
filename:'js/[name]-[hash:8].js'
[name]文件名称变量 默认main
[hash]生成不重复字符串 :8 一般最少六位
*/
filename: 'bundle-[hash:8].js'
},
2.4 开始进行webpack打包
在终端中使用命令进行打包:
npm run build ---这里前提是我们在 2.1第四步中package.json配置了"build":"server"
注意:package.sjon 文件内不能用注释,不能单引号
上述就相当于把src
文件夹下的index.js
文件打包到dist
文件下的bundle.js
,这时就生成了bundle.js
供index.html
文件引用
运行结果:
三、基本开发环境配置
为了让我们的项目看起来更像真正的公司项目,这里我们要配置生产和开发环境两个版本,方便在以后的项目开发中针对不同的环境进行打包。
3.1、配置基本开发环境
1、在项目根目录中创建一个config目录,专门用于存放webpack的相关配置文件
dev:生产环境
prod:开发环境
这里由于配置文件修改 enrty入口与 path输出位置 也要做相应调整
2、在package.json文件中的scripts自定义命令中修改webpack打包命令
"build-dev": "webpack --config ./config/webpack.config.dev.js",
"build": "webpack --config ./config/webpack.config.prod.js"
3、运行成功:
3.2、html-webpack-plugin插件
首先根目录下面创建一个public目录,并在此目录中创建一个index.html文件,使用 html-webpack-plugin插件,可以将此文件用于项目web入口文件模块。
1、设计与回顾
为了把上面的内容更好地吸收,我们重新撸一下思路。
第一步:创建项目 webpackProject
第二步:生成package.json
打开终端切换到 webpackProject工程下(win+r 输入cmd可以快速打开终端)
执行命令: npm init -y
第三步:下载webpack相关依赖
执行命令:npm i -D webpack webpack-cli
版本参考:"webpack": "^4.44.2", "webpack-cli": "^3.3.12"
第四步:新建子文件
第五步:webpack.config.dev.js内书写打包内容(这里稍稍有些区别)
const path = require('path');
module.exports = {
mode: 'development', //开发环境
entry: "./src/index.js", // 入口文件
output: {
path: path.resolve('dist'), //打包后的文件存放的地方
filename: "[name]-[hash:8].js" //打包后输出文件的文件名
}
}
!!从现在开始是新的内容
第六步:安装html-webpack-plugin ( 版本:"html-webpack-plugin": "^4.4.1",)
执行命令:npm i -D html-webpack-plugin
第七步:webpack.config.dev.js中配置 html-webpack-plugin
// 1、HWP引入 const HtmlWebpackPlugin = require('html-webpack-plugin') const path = require('path'); module.exports = { mode: 'development', //开发环境 entry: "./src/index.js", // 入口文件 output: { path: path.resolve('dist'), //打包后的文件存放的地方 filename: "[name]-[hash:8].js" //打包后输出文件的文件名 }, // 2、HWP使用 plugins:[ new HtmlWebpackPlugin({ title:'welcome Webpack', template:path.resolve(__dirname,'../public/index.html') }) ] } //注:path.join的功能是拼接路径片段。 /* path.resolve(__dirname,'../public/index.html') 相当于 cd config cd .. cd public cd index.html */
# 模板中使用定义的title index.html
四、构建本地服务器
现在我们是通过打开本地文件来查看页面的,看起来总感觉比较low,看别人用vue,react框架时都是运行在本地服务器上的,那我们能不能也那样呢?那必须的!
4.1 webpack-dev-server配置本地服务器
1、安装相关依赖 npm i -D webpack-dev-server
配置参数说明:
contentBase:'文件位置' 打包服务器所在位置 有变化从新reload
watchContentBase: true, 忽略文件,一版git忽略相关文件 watchOptions: {ignored: /node_modules/}, port:'8080' 端口号,不写默认8080 host:'localhost' 域名 open:true 自动打开浏览器 clientLogLevel: 'none', 不显示启动日志 quiet: true, 显示基本信息,其余不展示 overlay: false, 错误不全屏显示 inline: true, 文件修改后实时刷新 historyApiFallback: true, 不跳转 compress: true, gzip压缩 2、配置webpack.config.dev.jsconst HtmlWebpackPlugin = require('html-webpack-plugin') const path = require('path'); module.exports = { mode: 'development', //开发环境 entry: "./src/index.js", // 入口文件 output: { path: path.resolve('dist'), //打包后的文件存放的地方 filename: "[name]-[hash:8].js" //打包后输出文件的文件名 }, plugins: [ new HtmlWebpackPlugin({ title: 'welcom to Webpack', template: path.resolve(__dirname, '../public/index.html'), }) ],
//1、webpack-dev-server相关配置 devServer: { contentBase:path.resolve(__dirname,'../dist'),//服务器所在位置 //忽略文件 watchContentBase:true, watchOptions:{ ignored:/node_modules/ }, port:'8088', //端口号 host:'localhost', //域名 open:true, //自动打开浏览器 clientLogLevel:'none', //不显示启动日 quiet:true, //显示基本信息,其余不展示 overlay:false, //错误不全屏显示 //解决跨域 proxy:{ '/api':{ target:'http://localhost:3000', pathRewrite:{ '^/api':'' } } } } } //注:path.join的功能是拼接路径片段。 /* path.resolve(__dirname,'../public/index.html') 相当于 cd config cd .. cd public cd index.html */
3、配置package.json文件件
"server":"webpack-dev-server --config ./config/webpack.config.dev.js"
注意:json文件中不能用‘’单引号,不能写注释
4、终端运行 npm run server