Webpack 5 配置手册(从0开始)
针对新手入门搭建项目,Webpack5 配置手册(从0开始)
webpack安装顺序
1. `npm init -y`,初始化包管理文件 package.json
2. 新建src源代码目录
3. 新建index.html
4. `yarn add webpack webpack-cli`,安装webpack相关包
5. 在项目根目录中,创建webpack.config.js 的配置文件
6. `yarn add webpack-dev-server`,安装支持项目自动打包的工具,并配置
7. `yarn add html-webpack-plugin`,安装生成预览页面插件并配置
8. `yarn add style-loader css-loader`,安装处理css文件的loader
9. `yarn add less-loader less`,安装处理less文件的loader
10. `yarn add sass-loader node-sass`,安装处理scss文件的loader
11. `yarn add postcss postcss-loader postcss-preset-env autoprefixer`,配置postCSS自动添加css的兼容前缀(可选)
12. `yarn add url-loader file-loader`,安装处理css文件中的图片和字体文件
13. `yarn add html-loader`,安装处理html文件中的图片和字体文件
14. `yarn add @babel/core babel-loader @babel/preset-env 前面3个是必须的,后面的看需要 @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties`,安装处理js高级语法(ES6以上)
15. 之后看下面的插件安装代码。
yarn add html-webpack-plugin
yarn add style-loader css-loader
yarn add less-loader less
yarn add sass-loader node-sass
yarn add url-loader file-loader
yarn add html-loader
yarn add @babel/core babel-loader @babel/preset-env 前面3个是必须的,后面的看需要 @babel/plugin-transform-runtime @babel/plugin-proposal-class-properties
yarn add postcss postcss-loader postcss-preset-env
yarn add mini-css-extract-plugin
yarn add optimize-css-assets-webpack-plugin
yarn add eslint eslint-loader eslint-webpack-plugin
yarn add eslint-config-airbnb-base 或 eslint-config-airbnb 或 vue的eslint
yarn add clean-webpack-plugin
使用npx babel-upgrade
将所有关于babel的插件都升级都最新版本以适应兼容性
在.babelrc 中配置,或者在package.json中直接添加
{
"presets": ["@babel/preset-env"],
"plugins": [
"@babel/plugin-transform-runtime",
"@babel/plugin-proposal-class-properties"
]
}
webpack.config.js中配置插件
const path = require('path');
const htmlWebpackPlugin = require('html-webpack-plugin');
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
module.exports = {
mode: 'development',
entry: path.join(__dirname, './src/main.js'),
output: {
path: path.join(__dirname, './dist'),
filename: 'bundle.js',
},
// 插件
plugins: [
// html
new htmlWebpackPlugin({
template: path.join(__dirname, './src/index.html'),
filename: 'index.html',
}),
// 打包前清除dist
new CleanWebpackPlugin(),
],
// Loaders 部分
module: {
rules: [
{
// test设置需要匹配的文件类型,支持正则
test: /\.css$/,
// use表示该文件类型需要调用的loader
use: ['style-loader', 'css-loader'],
},
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader'],
},
{
test: /\.scss$/,
use: ['style-loader', 'css-loader', 'sass-loader'],
},
{
test: /\.(png|gif|bmp|jpg)$/,
use: {
loader: 'url-loader',
options: {
limit: 8 * 1024,
// 图片取10位hash和文件扩展名
name: '[hash:10].[ext]',
// 关闭es6模块化
esModule: false,
// 图片资源的输出路径
outputPath: 'images',
},
},
},
// 处理html中img资源
{
test: /.\html$/,
loader: "html-loader"
},
// 处理其他资源(一般指的就是字体资源等)
// {
// exclude: /\.(html|js|css|less|scss|jpg|png|gif)/,
// loader: "file-loader",
// outputPath:'media'
// },
{
test: /\.(woff(2)?|eot|ttf|otf|svg|)$/,
type: 'asset/inline',
},
{
test: /\.js/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env'],
plugins: ['@babel/plugin-proposal-class-properties'],
},
},
},
],
},
// 使用webpck-dev-server时配置
devServer: {
historyApiFallback: true,
contentBase: path.join(__dirname, './dist'),
open: true,
hot: true,
quiet: true,
port: 3000,
},
};
webpack.config.js中配置插件
const { resolve } = require('path');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCssAssetsWebpackPlugin = require('optimize-css-assets-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const ESLintPlugin = require('eslint-webpack-plugin');
// 导入每次删除文件夹的插件
const { CleanWebpackPlugin } = require('clean-webpack-plugin');
// 复用loader加载器
const commonCssLoader = [
MiniCssExtractPlugin.loader,
'css-loader',
// css兼容性处理
// 还需要在package.json中定义browserlist
'postcss-loader'
// 下面是根据路径找配置文件
// {
// loader: 'postcss-loader',
// options: {
// postcssOptions:{
// config:'./postcss.config.js'
// }
// }
// }
];
// 定义node.js到环境变量,决定使用browserslist的哪个环境
process.env.NODE_ENV = 'production';
module.exports = {
entry: './src/main.js',
output: {
filename: 'js/bundle.js',
path: resolve(__dirname, 'dist')
},
module: {
rules: [
{
test: /\.css$/,
use: [
...commonCssLoader,
]
},
{
test: /\.less$/,
use: [
...commonCssLoader,
'less-loader'
]
},
// {
// // eslint语法检查,在package.json中eslintConfig --> airbnb的校验规则
// test: /\.js$/,
// exclude: /node_modules/,
// // 优先执行,先执行eslint在执行babel
// enforce: 'pre',
// loader: 'eslint-loader',
// options: {
// fix: true
// }
// },
{
// js代码兼容性处理
test: /\.js$/,
exclude: /node_modules/,
loader: 'babel-loader',
options: {
presets: [
['@babel/preset-env', //基础预设
{
useBuiltIns: 'usage', // 按需加载
corejs: {
version: 3
},
targets: {
// 兼容到什么版本到浏览器
chrome: '60',
firefox: '50',
ie: '9',
safari: '10',
edge: '17'
}
}
]],
plugins: ['@babel/transform-runtime','@babel/plugin-proposal-class-properties'],
}
},
{
test: /\.(png|gif|bmp|jpg)$/,
use: {
loader: 'url-loader',
options: {
limit: 8 * 1024,
// 图片取10位hash和文件扩展名
name: '[hash:10].[ext]',
// 关闭es6模块化
esModule: false,
// 图片资源的输出路径
outputPath: 'images',
// publicPath : 这个则是生成的页面中对图片路径的引用时,加上publicPath。
publicPath: "../images"
}
}
},
// 处理html中img资源
{
test: /.\html$/,
loader: 'html-loader'
},
// 处理其他⽂件
{
exclude: /\.(js|css|less|html|jpg|png|gif)/,
loader: 'file-loader',
options: { outputPath: 'media', },
},
]
},
plugins: [
// css代码单独抽离
new MiniCssExtractPlugin({
filename: 'css/bundle.css'
}),
// css代码压缩
new OptimizeCssAssetsWebpackPlugin(),
// html文件压缩
new HtmlWebpackPlugin({
template: './src/index.html',
minify: {
// 移除空格
collapseWhitespace: true,
// 移除注释
removeComments: true
}
}),
// new ESLintPlugin({
// exclude:'node_modules',
// fix:true
// }),
new CleanWebpackPlugin(),
]
,
mode: 'production'
};
postcss.config.js配置
module.exports = {
// You can specify any options from https://postcss.org/api/#processoptions here
// parser: 'sugarss',
plugins: [
// Plugins for PostCSS
// ["postcss-short", { prefix: "x" }],
"postcss-preset-env",
],
};
.eslintlrc.js配置
module.exports = {
root: true,
env: {
commonjs: true,
es6: true,
browser: true,
node: true
},
extends: [
"airbnb-base",
// 'plugin:vue/essential',
// '@vue/standard'
],
parserOptions: {
ecmaVersion: 7,
ecmaFeatures: {
jsx: true,
experimentalObjectRestSpread: true,
},
parser: 'babel-eslint',
sourceType: "module"
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off'
}
}
.gitignore配置
node_modules/*
package-lock.json
dist/*
.idea/*
package.json配置
{
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"serve": "webpack serve",
"dev": "webpack --config webpack.config.js",
"build": "webpack --config webpack.pub.config.js"
},
"browserslist": {
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
],
"production": [
">0.2%",
"not dead",
"not op_mini all"
]
}
}
遇到的问题
- 开发环境,热部署devServer的重新配置,在webpack.config.js中添加热部署的部分代码,之后在package.json
文件内scripts中配置相应的webpack - 生产环境在package.json中的配置
"build": "webpack --config webpack.pub.config.js"
- 生产环境图片资源打包之后,网页显示不出来,需要在图片资源的打包中添加
publicPath: "../images"
,这个
则是生成的页面中对图片路径的引用时,加上publicPath,这样访问时姐可以放到文件的正确地址了。 - css代码的兼容性处理,使用postcss-loader的配置,可以直接在use里加载postcss-loader的配置文件,也可以直接
使用postcss-loader,让后打包时自动在根目录中找postcss.confgi.js配置文件,来加载postcss配置,此项目使用的
外部postcss.confgi.js配置文件的配置方式。注意:还需要在package.json中定义browserlist - 另外:目前还有生产环境懒加载和eslint校验代码的功能未完成,eslint的校验遇到问题
class Person { static info = { name: 'zs' }; }
,在生产环境的webpack.pub.config.js中引入来插件eslint-webpack-plugin,配置了new ESLintPlugin(),
但是提示错误信息如下,Parsing error: Unexpected token =
gitee 仓库地址
Webpack 5 配置手册(从0开始)的更多相关文章
- webpack的配置 @3.6.0
1.下载对应版本的webpack npm install webpack@3.6.0 -save --dev 2.新建webpack.config.js文件,目录结构↑ 3. >>webp ...
- nginx1.9.4 +php 5.5.29+yii2.0配置手册
nginx1.9.4 +php 5.5.29+yii2.0配置手册 目录 一. php5.5.29安装配置 2 二. nginx1.9.4安装配置 2 三. yii2.0 ...
- Varnish缓存服务器的搭建配置手册
Varnish缓存服务器的搭建配置手册 1.Varnish官方环境依赖提示 Installing Varnish Cache is as simple as enabling our package ...
- Ubuntu_10.04下Hadoop-0.20.2集群配置手册
Ubuntu_10.04下Hadoop-0.20.2集群配置手册 一.软硬件环境的准备 下面的文章来自hadoopor.com,我先交待一下我自己的环境: 两台机器,每台机器上面两个虚机(vmware ...
- Nginx+Tomcat+MemCached 集群配置手册
系统实施文档 Nginx+Tomcat+MemCached 集群配置手册 目 录 第1章 概述 1.1 目标 互联网的快速发展带来了互联网系统的高负载和高可用性, 这要求我们在设计系统架 ...
- webpack实用配置
前面的话 上文介绍了webpack入门,本文将详细介绍webpack实用配置 版本号 以entry.js打包为bundle.js为例,出口的filename可以设置为[id].[name].[hash ...
- 在找一份相对完整的Webpack项目配置指南么?这里有
Webpack已经出来很久了,相关的文章也有很多,然而比较完整的例子却不是很多,让很多新手不知如何下脚,下脚了又遍地坑 说实话,官方文档是蛮乱的,而且有些还是错的错的..很多配置问题只有爬过坑才知道 ...
- vue-cli+webpack打包配置
vue-cli+webpack打包配置 一: 目录结构: ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── ut ...
- Webpack的配置与使用
一.什么是Webpack? WebPack可以看做是模块打包机.用于分析项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等),将 ...
随机推荐
- 如何将多个 Apple 设备中保存在 iCloud 里面密码同步
如何将多个 Apple 设备中保存在 iCloud 里面密码同步 iCloud 钥匙串 密码同步 数据迁移 iOS iCloud 钥匙串会记住一些信息,因此您就无需记忆这些信息. 它会在您批准的任何设 ...
- Swift Playground All In One
Swift Playground All In One Swift 5.3 Playgrounds in Xcode Xcode 11.5 https://developer.apple.com/vi ...
- 智能货柜 & 技术原理 (动态视觉识别 + 重力感应)
智能货柜 & 技术原理 (动态视觉识别 + 重力感应) 智能货柜 拥有智能化.精细化运营模式的智能货柜成为代替无人货架继前进的方式. 相比无人货架来说,智能货柜的技术门槛更高,拥有 RFID. ...
- Flutter DraggableScrollableSheet 可滚动对象的容器
文档 Example import 'package:flutter/material.dart'; void main() => runApp(MyApp()); class MyApp ex ...
- uniapp 自定义弹窗组件
先上效果: 组件源码:slot-modal.vue <template> <view class="modal-container" v-if="sho ...
- C/C++子函数参数传递,堆栈帧、堆栈参数详解
本文转载自C/C++子函数参数传递,堆栈帧.堆栈参数详解 导语 因为参数传递和汇编语言有很大联系,之后会出现较多x86汇编代码. 该文会先讲一下x86的堆栈参数传递过程,然后再分析C/C++子函数是怎 ...
- 如何将IHttpHandler和IHttpModule迁移到ASP.NET Core中间件
ASP.NET Core是一个跨平台.开源的框架,用于在Windows.Mac和Linux操作系统(OS)上开发web应用程序.你可以使用以下任何IDE开发ASP.NET Core 应用程序: Vis ...
- 用量子计算模拟器ProjectQ生成随机数,并用pytest进行单元测试与覆盖率测试
技术背景 本文中主要包含有三个领域的知识点:随机数的应用.量子计算模拟产生随机数与基于pytest框架的单元测试与覆盖率测试,这里先简单分别介绍一下背景知识. 随机数的应用 在上一篇介绍量子态模拟采样 ...
- JUnit5学习之八:综合进阶(终篇)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- POJ-3281(最大流+EK算法)
Dining POJ-3281 这道题目其实也是网络流中求解最大流的一道模板题. 只要建模出来以后直接套用模板就行了.这里的建模还需要考虑题目的要求:一种食物只能给一只牛. 所以这里可以将牛拆成两个点 ...