帖子摘要: webpack基础理解 webpack就是将不同格式的文件打包成浏览器能够执行识别的文件 首先创建一些文件 npm init -y 初始化文件 生成一个配置文件package.json 这里如......
8 I& h$ ~3 [& e F) f
4 C; Q% t1 @3 C, \: g2 m 大家好,欢迎来到Java吧(www.java8.com),交流、学习Java技术、获取Java资源无任何套路,今天说一说:“webpack基础理解”
$ Y& ~, x+ r( m7 Q V1 b4 N
3 z7 E+ R) k$ m2 r, e6 Q. U% d8 X
; Z: I6 J/ S0 r
" s; Z' ^6 }, s: E
7 N2 P- n9 ~6 t8 _2 T, B
- R! O6 d8 C9 s8 w 4 C. r; ]" t3 }' n b/ f* X
" t( M8 A3 T- f: R( g' r& W q webpack基础理解 ) q0 n5 t+ |/ ` S" H2 d6 T8 J. b
webpack就是将不同格式的文件打包成浏览器能够执行识别的文件( w$ }0 n# D/ `* I/ u. {# e/ A
" k; ]* X) M: Z. u2 c1 ^. \
首先创建一些文件& H3 A% B" B3 A
% M W, a p3 C4 f9 m4 e; Q L: Y0 @ O 1 |/ I2 b) X& J4 e. X6 g1 X
) g- w' K$ @4 T* Z% m8 ] . u! J+ L9 l: U4 R. @ O" i
复制代码
初始化文件 生成一个配置文件package.json" x: E; ?$ D' Y: b" d) W0 V
; F5 w% a6 V7 E2 e# ~+ i8 J1 L6 m& o
这里如果直接打开静态文件引入main 他会提示你import引入这种模块化语法有问题浏览器并不能直接识别这时就需要我们通过webpack打包成浏览器识别的js语法. ?, U: x ]6 V- i+ M
npm i webpack webpack-cli -D 复制代码
//安装webpack包
+ I0 w0 g r6 m! L# Y: z( ^ npx webpack ./src/main.js --mode=development 复制代码
//开发环境5 N2 Q2 m: _' d- \# J* Z) ^+ a! W
npx webpack ./src/main.js --mode=production 复制代码
//生产环境
8 Z- u- j3 ?0 q; y+ X' y/ G
7 ], x& f7 S- z% u {
& p- H8 B& b7 G0 l " s5 F# V4 ^' b+ Y5 |/ H7 e
5 s& {# Q6 y' h* M) A0 \: U2 n
1 ]9 e$ T/ ]( c: U2 r* @8 w7 \ 8 q3 t7 j- t' [# P8 x$ }: ~
- _- Z6 ?* N+ d# G1 k$ X& C7 o; b . V, T- v$ C c$ q) e v
webpack配置
+ z, L+ ~7 q3 |0 y5 X" C% K4 W) N . \) d3 x+ h% X5 B
接下来就是对webpack文件的配置
D1 S4 B4 t: a1 N 入口entry+ w: x- p' v9 n% n7 s3 m
输出output
: P7 h- D" } c) [, K! f 加载器loader
3 u7 W$ S3 y6 T# H1 M+ J 插件plugins, V4 w; _; e% o T4 O
模式mode 开发development生产production
+ {* K x. x. Y; A2 K1 l
- M/ ~& v% v$ S2 E) d5 N - K' V& V7 J: z5 [% F0 D# ]* c
在webpack根目录加上webpack.config.js 写法固定不变8 t' v z& i K; g
5 j" n" V" l, t const path = require('path')//nodejs核心模块专门用来处理路径问题
+ Q6 R$ p+ ~- o module.exports = {
/ f; o" a' m+ Z0 Y0 `" m //入口
2 r( {! `: T4 \% l% M; a# B entry: './src/main.js',//相对路径
/ ~ u4 t0 G$ k% f. W8 y //出口
6 f8 v& ]+ L' d" i M( \ output: {
+ k* R$ O) \! D9 F- O* v% d! Z //__dirname nodejs变量代表当前文件夹目录当前文件侠士config.js 目录就是最外层的demo
% H) N% T0 K5 A path: path.resolve(__dirname, 'dist'),//绝对路径
, v3 I4 `* w( m% l //文件名
filename: 'static/index.js',
clean:true//每次打包清空之前
},
//加载器
module: {
- t6 f) a8 W; ?0 @2 R# Q //规则
// loader的配置
; S* L! V) e4 s2 O8 e6 d V# B rules: [
@& I: J+ X; }9 _# d: h& Z
]
$ d6 `2 y& K1 f7 H },
2 o5 r D. |) {+ j) A: \) h# X: I //插件
. L& k3 p7 ~+ l1 w plugins: [],
//模式
5 {6 t% l/ W: v8 j mode: "development"
}
复制代码
7 t; E) l' W* @. b5 [+ q, ?5 g
; c& v$ H2 W5 G( T: ]0 ? loader配置官方文档
- B0 _. Z) D# u6 c# ] 这里文档有个通病就是
3 {* I$ S& N- h! D
1 q5 _/ y; X: { 0 b2 t) Q* W) H0 J2 f4 ?" f2 D0 J
这里只让我们下载css-loader 而配置文件却是# _; g7 D4 i% K& U5 |2 w% v
{ test: /\.css$/i, use: ["style-loader", "css-loader"], }, 复制代码
: L7 Y4 r( w2 A) [% j
这时候会报错7 q& ~. V+ Y* g2 [- X2 E# g4 i
7 D0 N/ S" T1 z" o! o2 L& Z" B/ T 说我们style-loader没有找到
5 X7 W7 u, e' B# s* P! _- a( X
' a" J3 m3 I& p" v
( m" G3 e/ Q% M6 Z& R 正确的是同时也要下载style-loader复制代码
use可以使用多个loader数组形式而loader只能写一个loader
( b$ H) H" i. Z" J0 \$ }( l
8 e5 ?- S& C) u/ m& n, `8 M 下面主要讲解loader配置
( u* L% d* M8 W2 x4 g E- N2 D$ N" g* C
1 G* M6 X& g7 B/ i //加载器
module: {
//规则
! k" [7 J4 e0 j( ] // loader的配置
, i0 w* E3 a$ s rules: [
{
test: /\.css$/i,
use: ["style-loader", "css-loader"],
},
+ v/ N, U7 h/ M5 g# Z //图片性能优化小于10kb进行base64转换优点减少请求数量缺点体积变大
5 u7 A5 L7 D4 `, | {
test: /\.(png|jpe?g|gif|webp|svg)$/,//图片配置 如果是视频或者字体资源直接在这里改就行了
) P4 `' t7 H1 L! ]: A- J5 r- S b type: 'asset',//设置资源 type‘asset/resource’原封不动输出
+ M) a2 B$ e/ A- `" B. W generator: {
filename: "static/image/[hash:10][ext][query]",//打包文件名hash唯一值hash:10哈希值前10位ext后缀 query其他参数
& H+ W- ~- Q# ~" S7 u" W( `) _+ @ },
- a4 d# z$ B! ]; P# k9 A \( o parser: {
dataUrlCondition: {
$ o/ ~/ G7 r& _% g& D( Q1 C+ V // 小于10kb会转换base64
maxSize: 10 * 1024
: @. ^# q. H7 h& Y3 \$ y4 Y* L }
. z( e7 V9 o) h4 k- T6 [ }
}
]
* w, ^) B% j9 C* z1 R },
: C6 T2 f: {" r2 G; b2 q 复制代码
4 W* w. ^1 R9 d4 P$ u- x
深入配置文件ESLint 4 v, z% [3 r/ E3 W" ^, I
, o( `8 |& O$ N+ Q 由于以上配置仅对模块化语法进行编译对于箭头函数等等一系列还没有自己解析的规则因此我们需要进行配置来对jsx等等进行编译5 g" I& K1 B" `+ I5 G! q/ P
配置文件写法有很多 [4 s8 `! @7 P$ J; v: `+ |
; G$ O: @) z% w1 q. l1 _, n0 @
.eslintrc.* .eslintrc .eslintrc.js .eslintrc.json 区别在于配置格式写法不一样我们常用js来用
) t z# k+ P* Z9 w$ Y# X' S; v : N, o( J& _: l' `
还有一种写法就是直接在package.json中的eslintConfig中写这样就不需要创建文件在原有文件基础上写ESLint会自动查找并读取他们所以以上方式存在一个即可- V! p, s8 b# a8 C& A, z# P
, f, E H* p- G4 U9 M //以.eslintrc.js配置文件为例
) M5 M8 y3 L; d9 { module.exports={
& p) F" N/ E; D% I; p. p, S' Z. H/ O) Q //解析选项
$ f, _& G+ {2 f& |+ c# R perserOptions:{
ecmaVersion:6,//ES语法版本
sourceType:"module",//ES模块化
4 F/ V7 P: p' \3 I6 c2 u ecmaFeatures:{//Es其他特性
jsx:true//如果是React项目就需要开启jsx语法
}
( s* h$ t0 D" u. j5 y5 R },
# j* a0 ^& \ ^ //具体检查规则
# l; H: R$ b% I4 G1 q" [ rules:{},
//继承其他规则
: @, ]9 l F6 _5 o' F$ o2 O extends:[]
}
复制代码
* k8 u0 g" ~. p7 Q# q, a eslint官方文档9 d# I" N1 `) Z) I! g [# @9 b& Z
( l: n' I; H# o rules具体规则 6 ?( n3 P7 ~: R0 m1 U( y
"off"或0 -关闭规则 "warn"或1 -开启规则警告级别错误warn不会导致程序退出 "error"或2 -开启规则错误级别错误error触发时程序会退出 7 B& b% X% N8 |" v- |: X9 e
demo
W, F& \- W, H6 f ! }1 o+ W& P% j3 A9 x; ^ A5 x
rules:{
semi:"error",//禁止使用分号
/ z+ @5 @9 N3 c, K8 r0 W5 p' U( d0 Y0 K 'array-callbac-return':"warn",//强制数组方法的回调函数有return语句否则警告
. s( t$ [4 l3 S8 b 'default-case':[
'warn',//要求swutch语句中有default分支否则警告
{commentPattern:'^no default$'}//允许在最后注释 no default, 就不会有警告了
],
eqeqeq:[
1 f* {+ O/ G. I7 a! q8 L$ Z6 O 'warn',//强制使用=== 和!==否则警告
, |) V4 R! z2 L- o/ y, E; P+ a$ x! E 'smart'//除了少数情况下不会警告
" w8 H- m6 V8 p: t; ?6 L* p- `) m ]
5 Z0 W+ @4 P1 o" Z2 f }
$ I7 Z1 w: b5 B3 ^ 复制代码
! A" u: v1 }# d2 T+ b. _ extends 继承 + \% ?, P0 Y8 O/ Y6 e' y+ i
开发自己写rules规则太费经了所以最好的方式就是继承现有的规则
# T& }$ [2 R7 \" e/ K g2 t 常用的的规则' |! q- j( m( ^' o. Y
0 G0 P' [* q# z Eslint官方规则 eslint:recommended vue Cli:plugin:vue/essential react Cli:react-app $ a+ t8 `. ^1 c( G4 A& Z
//demo
* j* Y4 ~6 B$ K2 V( Q1 T module.exports={
//继承eslint规则
extends:["eslint:recommended"],
u h- ^5 T6 [; N0 e env:{
node:true,//启用node中全局变量
: o, S* A% S' s d4 p browser:true,//启用浏览器中全局变量
},
parserOptions:{
ecmaVersion:6,//es6中语法
E1 g7 |. S0 |6 i& c; Q sourceType:"module",
}
rules:{
$ ]. e0 a- \/ Q- K% k //在这里写的规则会自动覆盖继承的规则
"no-var":2,//不能使用var定义变量
. H0 O8 c6 ]5 i7 m9 K0 m# ?2 Z }
7 j2 N# I, [$ C3 d& @2 y }
复制代码
5 M; }2 T. S2 @1 z2 H
, u2 T4 }) r$ k) y * x1 T6 l( T2 K& A! j
, X. i+ K5 [) b 本文来源csdn,由Java吧转载发布,观点不代表Java吧的立场,转载请标明来源出处:https://www.java8.com