webpack
webpack中,有一些地方要用绝对路径的:地址
一.认识webpack工具
事实上随着前端的快速发展,目前前端的开发已经变的越来越复杂了:
比如开发过程中我们需要通过模块化的方式来开发;
比如也会使用一些高级的特性来加快我们的开发效率或者安全性,比如通过ES6+、TypeScript开发脚本逻辑,通过sass、less等方式来编写css样式代码;
比如开发过程中,我们还希望实时的监听文件的变化来并且反映到浏览器上,提高开发的效率;
比如开发完成后我们还需要将代码进行压缩、合并以及其他相关的优化;
等等….
但是对于很多的前端开发者来说,并不需要思考这些问题,日常的开发中根本就没有面临这些问题:
这是因为目前前端开发我们通常都会直接使用三大框架来开发:Vue、React、Angular;
但是事实上,这三大框架的创建过程我们都是借助于脚手架(CLI)的;
事实上Vue-CLI、create-react-app、Angular-CLI都是基于webpack来帮助我们支持模块化、less、TypeScript、打包优化等的;
二.webpack是什么?
webpack是一个静态的模块化打包工具,为现代的JavaScript应用程序;
打包bundler:webpack可以将帮助我们进行打包,所以它是一个打包工具
静态的static:这样表述的原因是我们最终可以将代码打包成最终的静态资源(部署到静态服务器);
模块化module:webpack默认支持各种模块化开发,ES Module、CommonJS、AMD等;
现代的modern:我们前端说过,正是因为现代前端开发面临各种各样的问题,才催生了webpack的出现和发展;
vue项目加载的文件有哪些呢?
JavaScript的打包:
将ES6转换成ES5的语法;
TypeScript的处理,将其转换成JavaScript;
Css的处理:
CSS文件模块的加载、提取;
Less、Sass等预处理器的处理;
资源文件img、font:
图片img文件的加载;
字体font文件的加载;
HTML资源的处理:
打包HTML资源文件;
处理vue项目的SFC文件.vue文件;
三.webpack基本打包
前面我们直接执行webpack命令使用的是全局的webpack,如果希望使用局部的可以按照下面的步骤来操作。
第一步:创建package.json文件,用于管理项目的信息、库依赖等. : npm init
第二步:安装局部的webpack. : npm install webpack webpack-cli -D
第三步:使用局部的webpack. : npx webpack
第四步:在package.json中创建scripts脚本,执行脚本打包即可 [npm run build]
{
"script":{
"build" : " webpack --config wk.config.js"
}
}
四.webpack配置文件
我们可以在根目录下创建一个webpack.config.js文件,来作为webpack的配置文件:

但是如果我们的配置文件并不是webpack.config.js的名字,而是其他的名字呢?
这个时候我们可以通过 --config 来指定对应的配置文件 : webpack --config wk.config.js
但是每次这样执行命令来对源码进行编译,会非常繁琐,所以我们可以在package.json中增加一个新的脚本: [npm run build]
{
"script":{
"build" : " webpack --config wk.config.js"
}
}
五.编写和打包css文件
什么是loader ?
loader 可以用于对模块的源代码进行转换;
我们可以将css文件也看成是一个模块,我们是通过import来加载这个模块的;
在加载这个模块时,webpack其实并不知道如何对其进行加载,我们必须制定对应的loader来完成这个功能;
配置loader?
const path = require("path")
module.exports = {
// 入口
entry: "./src/main.js",
// 出口
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./build")
},
// 配置loader
module: {
rules: [
{
test: /\.css$/, // text : 告诉webpack匹配什么文件
use: [ // use中多个loader的使用顺序是从后往前
{ loader: "style-loader" },
{ loader: "css-loader" }
],
},
// 简写一: 如果loader只有一个
{
test: /\.css$/,
loader: "css-loader"
},
// 简写二: 多个loader不需要其他属性时, 可以直接写loader字符串形式
{
test: /\.css$/,
use: [
"style-loader",
"css-loader",
"postcss-loader"
],
},
]
}
}
读取css文件常用的loader : css-loader
安装 : npm install css-loader -D
将css插入到页面用的loader : style-loader [css是通过页内样式的方式添加进来的]
安装 : npm install style-loader -D
less 文件 常用的loader : npm install less-loader -D
先用 less-loader , 再用 css-loader , 最后用 style-loader
postcss
是一个通过JavaScript来转换样式的工具 , 可以帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀、css样式的重置;
但是实现这些功能,我们需要借助于PostCSS对应的插件;
如何使用PostCSS呢?
1:查找PostCSS在构建工具中的扩展,比如webpack中的postcss-loader;
安装 : npm install postcss-loader -D
2:选择可以添加你需要的PostCSS相关的插件;
安装 : npm install postcss-preset-env -D
它可以帮助我们将一些现代的CSS特性,转成大多数浏览器认识的CSS,并且会根据目标浏览器或者运行时环境添加所需的polyfill;
也包括会自动添加浏览器前缀
const path = require("path")
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./build")
},
module: {
rules: [
{
test: /\.css$/,
use: [
{ loader: "style-loader" },,
{ loader: "css-loader" },
{
loader: "postcss-loader",
options: {
postcssOptions: {
plugins: [
"postcss-preset-env"
]
}
}
}
]
},
{
test: /\.less$/,
use: [ "style-loader", "css-loader", "less-loader", "postcss-loader" ]
}
]
}
}
也可以将这些配置信息放到一个单独的文件中进行管理 : 在根目录下创建postcss.config.js
module.exports = { plugins: [ require("postcss-preset-env") ] }
六.打包图片
const path = require("path")
module.exports = {
// 入口
entry: "./src/main.js",
// 出口
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./build"),
},
// 配置loader
module: {
rules: [
{
test: /\.(png|jpe?g|svg|gif)$/,
// 1.打包两张图片, 并且这两张图片有自己的地址, 将地址设置到img/bgi中
// 缺点: 多图片加载的两次网络请求
// type: "asset/resource",
// 2.将图片进行base64的编码, 并且直接编码后的源码放到打包的js文件中
// 缺点: 造成js文件非常大, 下载js文件本身消耗时间非常长, 造成js代码的下载和解析/执行时间过长
// type: "asset/inline"
// 3.合理的规范: [最好的]
// 3.1.对于小一点的图片, 可以进行base64编码
// 3.2.对于大一点的图片, 单独的图片打包, 形成url地址, 单独的请求这个url图片
type: "asset",
parser: {
dataUrlCondition: {
maxSize: 60 * 1024
}
},
// 定义文件名
generator: {
// 占位符 name: 指向原来的图片名称
// ext: 扩展名
// hash: webpack生成的hash
filename: "img/[name]_[hash:8][ext]"
}
},
]
},
}
七.打包JS代码
八.babel和babel-loader
babel : 可以将es6转换为es5 ; 可以转换TypeScript
安装 : npm install @babel/cli @babel/core -D
安装 : npm install babel-loader -D
如果我们一个个去安装使用插件,那么需要手动来管理大量的babel插件,我们可以直接给webpack提供一个preset
webpack会根据我们的预设来加载对应的插件列表,并且将其传递给babel
安装 : npm install @babel/preset-env
const path = require("path")
module.exports = {
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./build"),
// assetModuleFilename: "abc.png"
},
module: {
rules: [
{
test: /\.js$/,
use: [
{
loader: "babel-loader",
options: {
presets: [
"@babel/preset-env"
]
}
}
]
},
]
},
}
九.认识插件Plugin
const path = require("path")
const HtmlWebpackPlugin = require('html-webpack-plugin')
const { DefinePlugin } = require("webpack")
module.exports = {
mode: "production",
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./build"),
clean: true //不用再手动删除dist文件夹
},
plugins: [
new HtmlWebpackPlugin({
// 标题 : 在index 通过 <%= htmlWebpackPlugin.options.title %> 读
title: "电商项目",
// 自己定义的模板
template: "./index.html"
}),
// 全局可用的 :
new DefinePlugin({
BASE_URL: "'./'",
coderwhy: "'why'",
counter: "123"
})
]
}
十.开启本地服务器
安装webpack-dev-server : npm install webpack-dev-server -D
修改配置文件package.json 的 "serve": "webpack serve --config wk.config.js"
1.HMR热模块替换
const path = require("path")
module.exports = {
mode: "development",
entry: "./src/main.js",
output: {
filename: "bundle.js",
path: path.resolve(__dirname, "./build"),
clean: true
},
devServer: {
hot: true, // 开启热更新
host: "0.0.0.0", //主机地址 : 希望其他地方也可以访问,可以设置为 0.0.0.0
port: 8888, //设置监听的端口,默认情况下是8080
open: true, //open是否打开浏览器:
compress: true //是否为静态文件开启gzip compression
}
}
十一.Proxy(Vue项目学习)
十二.changeOrigin的解析(Vue项目学习)
十三.historyApiFallback (Vue项目学习)
十四.如何区分开发环境
入口文件的解析

本文来自博客园,作者:杨建鑫,转载请注明原文链接:https://www.cnblogs.com/qd-lbxx/p/16565515.html

浙公网安备 33010602011771号