现在做前端开发用 webpack 很多,之前有深入研究过,并且做了很多相关笔记。一直想着整理出来,刚好同事这两天有问到我 webpack 相关的问题,趁着这个机会我自己也好好梳理一下。

准备写 webpack 的系列文章,从基础、优化到原理。

最基本使用

安装 webpack 依赖:

npm install webpack@4 webpack-cli@3 -D

注意: 由于我们公司当前所有项目都未升级到 webpack5.x,所以这系列文章基于 webpack4.x 来写,后续单独写 webpack5.x 相关的。

创建 webpack.config.js

如果不创建 webpack.config.js,webpack 会使用默认的配置的文件,但是默认的配置文件功能很弱,这里就不再讲了。项目开发过程中都会自己写配置文件。

配置文件的名字也可以不叫 webpack.config.js,只需要在执行 webpack 命令的时候声明即可:

npx webpack --config 你自己的定义的文件名

注意:正常情况下,我们都不会去改配置文件的名称。

entry、output

在项目目录下建一个 src 目录,在 src 目录下创建 index.js、test1.js

test1.js

exports.name = 'iceman';

index.js

const test1 = require('./test1');console.log(test1.name);

写 webpack.config.js 中的配置的时候需要知道 webpack 是 node 写出来的,所以要遵循 node 的语法。

module.exports = {  entry: './src/index.js',  output: {    filename: 'main.js',    path: path.resolve(__dirname, 'dist'),  }}

entry 为入口文件。

output 为输出的配置:

  • filename:打包后的文件名,可以给 filename 加上 hash ,每次打包后的文件名就不一样了,可以防止缓存。filename: 'main.[hash].js',如果觉得 hash 太长,可以设置长度 filename: 'main.[hash:8].js'
  • path:打包后的文件的输出路径,这里的路径必须是一个绝对路径,可以使用 node 的 path 模块中的 resolve 生成绝对路径。

mode

做完以上配置之后,输入打包命令:

npx webpack

能打包,但是输出警告信息:

这段警告告诉我们没有设置 mode,webpack 会默认使用 production。mode 的设置可以在控制台输入打包命令的时候添加:

npx webpack --mode=production

也可以在配置文件中指定:

注意:这里只是演示,一般不会直接写死 “production” 、“development”,都是通过控制台输入打包命令的时候设置变量,然后动态判断。

#plugins

我们现在将一个 HTML 文件也打包进 dist 文件中,作为我们项目的入口 HTML。

在这个 HTML 中还要将 dist 中的 JavaScript 入口文件引进去,这个操作肯定不可能每次都手动的操作。

这时候就要用到 plugins 了,plugins 是个数组,里面放所有的 webpack 插件。拷贝 HTML 可以用 html-webpack-plugin 插件。

plugins: [  new HtmlWebpackPlugin({    template: './src/index.html',    filename: 'index.html'  }),]

这个插件中的 template、filename 这两个参数很好理解,就是需要拷贝的模板和输出的文件名。输出到 dist 中的 HTML 如下:

输出的 HTML 文件中,已经自动引入了入口 JavaScript 文件。

该插件还有其他几个参数:

new HtmlWebpackPlugin({  template: "./src/index.html",  filename: "index.html",  minify: {    removeAttributeQuotes: true,    collapseWhitespace: true,  },  hash: true})
  • minify#removeAttributeQuotes:去除 HTML 中的引号
  • minify#collapseWhitespace:将空行压缩
  • hash:引入 JavaScript 文件加上随机的 url 参数

module

到现在为止,已经将 HTML、JavaScript 都打包了。如果这时候要引入样式文件呢?

如果要打包样式,需要用到样式相关的 loader。loader 写在 module 的 rules 中。

安装 css-loader 和 style-loader:

npm install css-loader style-loader -D
module: {  rules: [    {test: /.css$/, use: ['style-loader', 'css-loader']}  ]}

loader 的执行顺序是 从右向左

css-loader 的作用是解析 @import 这样的语法,style-loader 的作用是把 css 插入到 head 标签中。

从这里也可以看出,loader 的设计理念是功能单一,一个 loader 只做一件事,然后组合做个 loader。

loader 的写法除了上面的字符串的形式,还可以写成对象的形式,用对象的形式有一个好处就是可以给 loader 加参数:

module: {  rules: [    {      test: /.css$/,      use: [        {          loader: 'style-loader',          options: {            insertAt: 'top',          }        },        'css-loader'      ]    }  ]}

在 src 下写一个样式文件 test02.css:

body {  background-color: #ddd;}

index.js 中引入:

require('./test02.css');

以上的操作之后,就可以打包 css 文件了。如果要打包 Less,也是一样的思路,加上相应的 loader 即可:

{  test: /.less$/,  use: ['style-loader', 'css-loader', 'less-loader']}

webpack-dev-server

平时开发过程中,修改了某个 JavaScript 文件,或者某个 css 文件,如果每次都要手动打包一次,然后再手动打开 index.html,那么效率相当低。这一点 webpack 也考虑到了,提供了 webpack-dev-server 给我们使用。

npm install webpack-dev-server

在配置文件中加入相关配置:

devServer: {  port: 8080,  // 显示进度条  progress: true,  // 根目录  contentBase: './dist',  // 是否开启 gzip 压缩  compress: true}

样式处理

走完一遍 最基本的使用 之后,对 webpack 已经不那么陌生了。接下来我们继续学习使用 webpack。

在上面讲解 module 的时候,有介绍到样式的处理,介绍了 style-loader、css-loader、less-loader,有了这三个插件,已经能正常的处理样式了。不过还不够,对于样式的处理,还有一些细节。

样式抽取为单独的文件

现在所有的样式都是直接插入到 中。

可以使用 mini-css-extract-plugin 来抽取样式。

webpack.config.js

const MiniCssExtractPlugin = require('mini-css-extract-plugin');module.exports = {  plugins: [    new MiniCssExtractPlugin({      filename: 'main.css',    }),  ],}

除了在 plugins 中添加相应的插件之外。还需要将 module 的 rules 中和样式相关的 style-loader 换成 MiniCssExtractPlugin.loader。

自动补齐 CSS3 属性前缀

安装依赖:

npm i postcss-loader autoprefixer@8 -D

注意:在使用中控制台报错,Error: PostCSS plugin autoprefixer requires PostCSS 8. Update PostCSS or downgrade this plugin,提示我们要使用8.x的版本。

postcss-loader 必须放在 css-loader 之前。

根目录下新建 postcss.config.js

module.exports = {  plugins: [require('autoprefixer')],}

压缩 CSS 文件

安装依赖:

npm i optimize-css-assets-webpack-plugin -D

在配置文件中新加 optimization ,就是优化项的意思。

optimization: {    minimizer: [      new OptimizeCssAssetsPlugin(),    ]}

做完以上配置之后,css 文件就会压缩。

既然 CSS 文件可以压缩了,那么 JS 文件是不是也可以压缩呢?

安装依赖:

npm i uglifyjs-webpack-plugin -D
optimization: {  minimizer: [    new UglifyJsPlugin({      cache: true,      parallel: true,      sourceMap: true,    }),  ]}

参数的具体含义以及其他参数可查看文档:https://www.npmjs.com/package/uglifyjs-webpack-plugin。

注意:以上压缩的配置一定是在 mode: 'production' 的情况生效的,在 development 的情况下不会生效。

ES6+

编译 ES6

const fn = () => {  console.log('aa');}fn();

这段箭头函数的代码,默认情况下是不会被编译的。需要用 babel。

安装依赖

npm i babel-loader @babel/core @babel/preset-env  -D
module: {  rules: [    {      test: /.js$/,      use: {        loader: 'babel-loader',        options: {          presets: [            '@babel/preset-env',          ],        },      },    }  ]}

编译 decorator

以上的配置无法编译 decorator,需要加额外配置。

function Controller(target) {  console.log(target);}@Controllerclass A {  }
npm i @babel/plugin-proposal-decorators @babel/plugin-proposal-class-properties -D
module: {  rules: [    {      test: /.js$/,      use: {        loader: 'babel-loader',        options: {          presets: [            '@babel/preset-env',          ],          "plugins": [             ["@babel/plugin-proposal-decorators", { "legacy": true }],             ["@babel/plugin-proposal-class-properties", { "loose" : true }]          ]        },      },    }  ]}

打包图片

图片一般会以是那种情况出现:

  • JS 代码中直接使用
  • CSS 中引入
  • img 标签中使用

JS、CSS 中使用

安装依赖

npm install file-loader@3 -D

配置文件:

module: {  rules: [    {      test: /.(png|jpg|gif)&/,      use: {        loader: 'file-loader',      }    }  ]}

JS 中使用:

import st from './st.jpg';const img = new Image();img.src = st;document.body.appendChild(img);

CSS中使用:

body {  background-image: url("./st.jpg");}

注意这里的如果 file-loader 用的不是 3.x 版本的话,编译出来的 css 文件会有问题:

以上两种方式都是使用的 file-loader,file-loader 的机制是在内部生成一张图片,到build目录下,再把生成的图片的名字返回回来。

还有一个 url-loader,它会将图片 BASE64 编码:

{  test: /.(png|jpg|gif)$/,  use: {    loader: 'url-loader',    options: {      limit: 10 * 1024,      outputPath: '/img/',    }  }}

outputPath 为图片的输出路径。

当图片小于 limit 的时候会把图片 BASE64 编码,大于 limit 参数的时候还是使用 file-loader 进行拷贝。

注意:BASE64 编码之后,图片的体积会变大三分之一左右,所以对于较大得图片不要用 url-loader,在 options 中设置 limit。

img 标签中使用

在 img 标签中使用图片,需要 html-withimg-loader

安装依赖

npm i html-withimg-loader -D

配置文件

{  test: /.html$/,  use: 'html-withimg-loader'}

html引入css webpack_深入剖析webpack——webpack 基础相关推荐

  1. web项目html引入css文件路径,详解Webpack和Webpack-simple中如何引入CSS文件_旧店_前端开发者...

    博主最近研究 首先说一下如何在webpack中引入 之后在App.vue文件中在style标签项目写入你想要引入的样式: 本例引入的样式是一个名为nam.css的文件,该文件只是让页面变蓝,之后运行即 ...

  2. html如何引入less,VueJS如何引入css或者less文件的一些坑

    我们在做Vue+webpack的时,难免会引入各种公共css样式文件,那么我们改如何引入呢?引入时会有那些坑呢? 首先,引入公共样式时,我们在"main.js"里使用AMD的方式引 ...

  3. webpack html转成js,WebPack的基础学习

    Webpack Webpack 是一个前端的静态模块资源打包工具,能让浏览器也支持模块化.它将根据模块的依赖关系进行静态分析,然后将这些模块按照指定的规则生成对应的静态资源. Webpack 核心主要 ...

  4. webpack——webpack与浏览器缓存(十六)

    调整项目 项目结构: src/index.js import _ from 'lodash' import $ from 'jquery'const dom = $('<div>') do ...

  5. 移动端适配-flexible.js使用(解决对外部引入css,px2rem能不能转换rem问题)

    移动端flexible.js 适用于最新版vue-cli,配置手淘的lib-flexible.js和rem实现移动端页面自适应 1.安装lib-flexible.js npm install lib- ...

  6. react slick安装后引入css样式报错

    使用react-slick是为了在使用react hook的同时更加方便的实现轮播图. 因为看到antd组件库的走马灯太简单,不好复制,所以自以为找到了cv的好途径. 但,我不知道的是react-sl ...

  7. vue项目html引入css,vue项目引入自定义.css的样式文件

    ES6的引入方式: .vue文件中 css文件引入 @import "../assets/common/common.css";//自定义.css的样式路径 js文件的引入 在ma ...

  8. webpack大全---------(基础配置篇)----4.webpack实例三

    上一篇:webpack大全---------(基础配置篇)----2.webpack实例二 webpack实例三:讲述代码效验模块eslint.引入第三方模块的处理.图片的打包处理. 第一步:安装配置 ...

  9. Vue2,Webpack的基础配置以及使用脚手架创建工程

    Webpack的基础配置以及使用脚手架创建工程 文章目录 Webpack的基础配置以及使用脚手架创建工程 一.模块化 二.webpack 1.在项目中安装webpack 2.完成更加复杂的打包工作(c ...

最新文章

  1. Unity 好消息,中文版Unity来啦!!!
  2. 下列关于linux的进程,描述不正确的是,进程是资源管理的最小单位,2012年7月成人自考网络操作系统考试真题...
  3. 前端学习(1908)vue之电商管理系统电商系统之渲染修改用户的表单预先验证
  4. linux win7 默认启动,请教:我的grub.cfg里面的内容如下,请教怎样改代码才能让WIN7设为默认启动...
  5. asp:boundfield 鼠标悬停后显示_设计了100张图表后,我学到了哪些经验?
  6. CCF201612-1 中间数(解法二)(100分)(废除!!!)
  7. STM32串口通信实验(学习笔记)
  8. mysql schemata_SCHEMATA · xiaoboluo768/mysql-system-schema Wiki · GitHub
  9. 试用了5款BI分析工具,终于找到了上手最快的那一个!
  10. 小米 信号测试软件,小米WiFi测试版
  11. 计算机打印设置方法,针式打印机设置教程详解,小编教你针式打印机设置共享/纸张大小方法...
  12. Chrome Devtool — Performance
  13. 【操作系统】进程:管程
  14. 数理统计学类毕业论文文献都有哪些?
  15. 配置Hive在mysql上的元数据库时Underlying cause: java.lang.ClassNotFoundException : com.mysql.jdbc.Driver
  16. 常用电平标准(TTL、CMOS、LVTTL、LVCMOS、ECL、PECL、LVPECL、RS232)
  17. 2022春夏五大系列新品亮相,都市丽人构建多层次的产品矩阵
  18. 如何批量设置 Word 文档的限制编辑?
  19. Kali Linux更新5.2.9后 Vmware Workstation无法正常启动
  20. dcdc电源 拓扑 分析

热门文章

  1. 077 Combinations 组合
  2. wifi两种工作模式
  3. 【idea】idea快捷键(更新中....)
  4. secureCRT使用退格键(backspace)出现^H解决的方法
  5. IT人必读:写给浮躁的IT同仁
  6. 7 centos 时钟跟物理机同步_同步FIFO和异步FIFO
  7. 查看java线程是否退出_[原创]IDA调试阻止java线程异常退出
  8. datetime报错 sql脚本_SQLSERVER 中datetime 和 smalldatetime类型分析说明
  9. 【连载】如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(4)
  10. Oracle私网mtu滚动修改实施方案