webpack基本使用

news2024/9/28 1:20:37

1、内置模块path

(1)path模块用于对路径和文件进行处理,提供了很多好用的方法。

(2)我们知道在Mac OSLinuxwindow上的路径时不一样的

  • window上会使用 \或者 \\ 来作为文件路径的分隔符,当然目前也支持 /;
  • Mac OSLinuxUnix操作系统上使用 / 来作为文件路径的分隔符;

(3)那么如果我们在window上使用 \ 来作为分隔符开发了一个应用程序,要部署到Linux上面应该怎么办呢?

  • 显示路径会出现一些问题
  • 所以为了屏蔽他们之间的差异在开发中对于路径的操作我们可以使用 path 模块

(4)从路径中获取信息

  • dirname:获取文件的父文件夹;
  • basename:获取文件名;
  • extname:获取文件扩展名;

(5)路径的拼接:path.join

  • 如果我们希望将多个路径进行拼接,但是不同的操作系统可能使用的是不同的分隔符;
  • 这个时候我们可以使用path.join函数;

(6)拼接绝对路径:path.resolve

  • path.resolve() 方法会把一个路径或路径片段的序列解析为一个绝对路径;
  • 给定的路径的序列是从右往左被处理的,后面每个 path 被依次解析,直到构造完成一个绝对路径;
  • 如果在处理完所有给定path的段之后,还没有生成绝对路径,则使用当前工作目录;
  • 生成的路径被规范化并删除尾部斜杠,零长度path段被忽略;
  • 如果没有path传递段,path.resolve()将返回当前工作目录的绝对路径;
const path = require("path")

const filepath = "C://abc/cba/nba.txt"

// 1.可以从一个路径中获取一些信息
console.log(path.extname(filepath))
console.log(path.basename(filepath))
console.log(path.dirname(filepath))


const path1 = "/abc/cba"
const path2 = "../why/kobe/james.txt"
// console.log(path1 + path2)

// 2.将多个路径拼接在一起: path.join
// console.log(path.join(path1, path2))

(7)webpack中获取路径或者起别名的地方也可以使用

 

2、认识webpack

事实上随着前端的快速发展,目前前端的开发已经变的越来越复杂了:

  • 比如开发过程中我们需要通过模块化的方式来开发;
  • 比如也会使用一些高级的特性来加快我们的开发效率或者安全性,比如通过ES6+TypeScript开发脚本逻辑,通过sassless等方式来编写css样式代码;
  • 比如开发过程中,我们还希望实时的监听文件的变化来并且反映到浏览器上,提高开发的效率;
  • 比如开发完成后我们还需要将代码进行压缩、合并以及其他相关的优化
  • 等等….

但是对于很多的前端开发者来说,并不需要思考这些问题,日常的开发中根本就没有面临这些问题:

  • 这是因为目前前端开发我们通常都会直接使用三大框架来开发:VueReactAngular
  • 但是事实上,这三大框架的创建过程我们都是借助于脚手架(CLI的;
  • 事实上Vue-CLIcreate-react-appAngular-CLI都是基于webpack来帮助我们支持模块化、lessTypeScript、打包优化等的;

 

3、Webpack到底是什么呢?

(1)我们先来看一下官方的解释:

        webpack is a static module bundler for modern JavaScript applications

(2)webpack是一个静态的模块化打包工具,为现代的JavaScript应用程序;

(3)我们来对上面的解释进行拆解:

  • 打包bundlerwebpack可以将帮助我们进行打包,所以它是一个打包工具
  • 静态的static这样表述的原因是我们最终可以将代码打包成最终的静态资源(部署到静态服务器);
  • 模块化modulewebpack默认支持各种模块化开发,ES ModuleCommonJSAMD等;
  • 现代的modern我们前端说过,正是因为现代前端开发面临各种各样的问题,才催生了webpack的出现和发展;

 

4、Webpack的使用前提

webpack的官方文档是webpackwebpack is a module bundler. Its main purpose is to bundle JavaScript files for usage in a browser, yet it is also capable of transforming, bundling, or packaging just about any resource or asset.https://webpack.js.org/

webpack的中文官方文档是webpackwebpack 是一个模块打包器。它的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换(transform)、打包(bundle)或包裹(package)任何资源(resource or asset)。https://webpack.docschina.org/

DOCUMENTATION:文档详情,也是我们最关注的

Webpack的运行是依赖Node环境的,所以我们电脑上必须有Node环境

Node官方网站:Node.js

 

5、Webpack的安装

webpack的安装目前分为两个:webpackwebpack-cli

那么它们是什么关系呢?

  1. 执行webpack命令,会执行node_modules下的.bin目录下的webpack;
  2. webpack在执行时是依赖webpack-cli的,如果没有安装就会报错;
  3. webpack-cli中代码执行时,才是真正利用webpack进行编译和打包的过程;
  4. 所以在安装webpack时,我们需要同时安装webpack-cli(第三方的脚手架事实上是没有使用webpack-cli的,而是类似于自己的vue-service-cli的东西)

npm install webpack webpack-cli –g # 全局安装

npm install webpack webpack-cli –D # 局部安装

或使用yarn(前提是下载好)

 yarn add webpack webpack-cli -g # 全局安装

 yarn add webpack webpack-cli -D # 局部安装

6、Webpack的默认打包

(1)我们可以通过webpack进行打包,之后运行打包之后的代码

在目录下直接执行 webpack 命令(这种方式,前提是你安装了全局的webpack,但是这种方式不推荐)

webpack

(2)生成一个dist文件夹,里面存放一个main.js的文件,就是我们打包之后的文件:

  • 这个文件中的代码被压缩和丑化了;
  • 另外我们发现代码中依然存在ES6的语法,比如箭头函数、const等,这是因为默认情况下webpack并不清楚我们打包后的文件是否需要转成ES5之前的语法,后续我们需要通过babel来进行转换和设置;

(3)我们发现是可以正常进行打包的,但是有一个问题,webpack是如何确定我们的入口的呢?

  • 事实上,当我们运行webpack时,webpack会查找当前目录下的 src/index.js作为入口;
  • 所以,如果当前项目中没有存在src/index.js文件,那么会报错;

(4)当然,我们也可以通过配置来指定入口和出口

npx webpack --entry ./src/main.js --output-path ./build

7、创建局部的webpack

        前面我们直接执行webpack命令使用的是全局的webpack,如果希望使用局部的可以按照下面的步骤来操作。

第一步:创建package.json文件,用于管理项目的信息、库依赖等

npm init 或 yarn init

第二步:安装局部的webpack

npm install webpack webpack-cli -D 或 yarn add webpack webpack-cli -D

第三步:使用局部的webpack

npx webpack  或 npm webpack yarn webpack

第四步:在package.json中创建scripts脚本,执行脚本打包即可

npm run build 

8、Webpack配置文件

  • 在通常情况下,webpack需要打包的项目是非常复杂的,并且我们需要一系列的配置来满足要求,默认配置必然是不可以的。
  • 我们可以在根目录下创建一个webpack.config.js文件,来作为webpack的配置文件:
// 人物属性
const path = require('path');

module.exports = {
  entry: './src/main.js', // 指定webpack入口
  output: { // 指定webpack压缩后的文件出口
    path: path.resolve(__dirname, 'dist'), // 指定输出路径
    filename: 'bundle.js',  // 指定输出文件名
  },
};

继续执行webpack命令,依然可以正常打包

9、指定配置文件

但是如果我们的配置文件并不是webpack.config.js的名字,而是其他的名字呢?

  • 比如我们将webpack.config.js修改成了 wk.config.js
  • 这个时候我们可以通过 --config 来指定对应的配置文件;

webpack --config wk.config.js

        但是每次这样执行命令来对源码进行编译,会非常繁琐,所以我们可以在package.json中增加一个新的脚本:

  "scripts": {
    "build": "webpack --config wk.config.js"
  }

之后我们执行 npm run build来打包即可。

10、Webpack的依赖图

webpack到底是如何对我们的项目进行打包的呢?

  • 事实上webpack在处理应用程序时,它会根据命令或者配置文件找到入口文件;
  • 从入口开始,会生成一个 依赖关系图,这个依赖关系图会包含应用程序中所需的所有模块(比如.js文件、css文件、图片、字体等);
  • 然后遍历图结构,打包一个个模块(根据文件的不同使用不同的loader来解析);

 

11、编写案例代码出现的问题

通过JavaScript创建了一个元素,并且希望给它设置一些样式;

common.js

import "../css/div_style.css"  

// 创建div元素
const divEl = document.createElement("div")
divEl.textContent = "Hello World"
divEl.classList.add("content")
document.body.append(divEl)


// 创建h2元素
const titleEl = document.createElement("h2")
titleEl.textContent = "哈哈哈哈"
titleEl.classList.add("title")
document.body.append(titleEl)

div_style.css

.content {
  font-size: 20px;
  color: red;

  user-select: none;
  background-color: #66666666;
}

main.js

// 引入到main.js (因为这里是入口需要产生关系, 才会被webpack找到打包起来)
import "./common.js"

继续编译命令npm run build

 

12、css-loader的使用

上面的错误信息告诉我们需要一个loader来加载这个css文件,但是loader是什么呢?

  • loader 可以用于对模块的源代码进行转换;
  • 我们可以css文件也看成是一个模块,我们是通过import来加载这个模块的;
  • 在加载这个模块时,webpack其实并不知道如何对其进行加载,我们必须制定对应的loader来完成这个功能;

那么我们需要一个什么样的loader呢?

  • 对于加载css文件来说,我们需要一个可以读取css文件的loader;
  • 这个loader最常用的是css-loader

css-loader的安装:

npm install css-loader -D

13、css-loader的使用方案

如何使用这个loader来加载css文件呢?有三种方式:

  • 内联方式;
  • CLI方式(webpack5中不再使用);
  • 配置方式;

内联方式:内联方式使用较少,因为不方便管理;

在引入的样式前加上使用的loader,并且使用!分割;

loader配置方式

  • 配置方式表示的意思是在我们的webpack.config.js文件中写明配置信息:
    • module.rules中允许我们配置多个loader(因为我们也会继续使用其他的loader,来完成其他文件的加载);
    • 这种方式可以更好的表示loader的配置,也方便后期的维护,同时也让你对各个Loader有一个全局的概览;
  • module.rules的配置如下:
    • rules属性对应的值是一个数组:[Rule]
    • 数组中存放的是一个个的RuleRule是一个对象,对象中可以设置多个属性:
      • ​​​​test属性:用于对 resource(资源)进行匹配的,通常会设置成正则表达式;
      • use属性:对应的值时一个数组:[UseEntry]
        • UseEntry是一个对象,可以通过对象的属性来设置一些其他属性
        • loader必须有一个 loader属性,对应的值是一个字符串;
        • options可选的属性,值是一个字符串或者对象,值会被传入到loader中;
        • query目前已经使用options来替代;
        • 传递字符串(如:use: [ 'style-loader' ])是 loader 属性的简写方式(如:use: [ { loader: 'style-loader'} ]);
      • loader属性: Rule.use: [ { loader } ] 的简写。

Loader的配置代码

 

14、style-loader

我们已经可以通过css-loader来加载css文件了

但是你会发现这个css在我们的代码中并没有生效(页面没有效果)

这是为什么呢?

  • 因为css-loader只是负责将.css文件进行解析,并不会将解析之后的css插入到页面中;
  • 如果我们希望再完成插入style的操作,那么我们还需要另外一个loader,就是style-loader

安装style-loader

npm install style-loader -D 或 yarn add style-loader  -D

那么我们应该如何使用style-loader

  • 在配置文件中,添加style-loader;
  • 注意:因为loader的执行顺序是从右向左(或者说从下到上,或者说从后到前的),所以我们需要将style-loader写到css-loader的前面;
use: [ // use中多个loader的使用顺序是从后往前
           { loader: "style-loader" },
           { loader: "css-loader" }
]

        重新执行编译npm run build,可以发现打包后的css已经生效了:当前目前我们的css是通过页内样式的方式添加进来的;

15、处理less文件

  • 在我们开发中,我们可能会使用lesssassstylus的预处理器来编写css样式,效率会更高。
  • 那么,如何可以让我们的环境支持这些预处理器呢?

    首先我们需要确定,lesssass等编写的css需要通过工具转换成普通的css

  • 比如我们编写如下的less样式:
    @fontSize: 50px;
    @fontColor: blue;
    
    .title {
      font-size: @fontSize;
      color: @fontColor;
    
      user-select: none;
    }
    
    

我们可以使用less工具来完成它的编译转换:

npm install less -D 或 yarn add less -D

n执行如下命令:

npx lessc ./src/css/title.less title.css

less-loader处理

但是在项目中我们会编写大量的css,它们如何可以自动转换呢?

这个时候我们就可以使用less-loader,来自动使用less工具转换lesscss

npm install less-loader -Dyarn add less-loader -D

配置webpack.config.js

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

执行npm run build 命令less就可以自动转换成css,并且页面也会生效了

15、PostCSS工具

什么是PostCSS呢?

  • PostCSS是一个通过JavaScript来转换样式的工具;
  • 这个工具可以帮助我们进行一些CSS的转换和适配,比如自动添加浏览器前缀、css样式的重置;
  • 但是实现这些功能,我们需要借助于PostCSS对应的插件;

如何使用PostCSS呢?主要就是两个步骤:

  • 第一步:查找PostCSS在构建工具中的扩展,比如webpack中的postcss-loader
  • 第二步:选择可以添加你需要的PostCSS相关的插件;

16、postcss-loader

  • 我们可以借助于构建工具:webpack中使用postcss就是使用postcss-loader来处理的;
  • 我们来安装postcss-loader:npm install postcss-loader -D
  • 我们修改加载cssloader
  • 注意:因为postcss需要有对应的插件才会起效果,所以我们需要配置它的plugin

单独的postcss配置文件 

因为我们需要添加前缀,所以要安装autoprefixer

npm install autoprefixer -D

我们可以将这些配置信息放到一个单独的文件中进行管理:

        在根目录下创建postcss.config.js ,注意这个名字是固定的,当插件未在webpack.config.js,中配置,会自动检测目录中是否有这个配置文件,并把它加载到插件中

postcss-preset-env 

事实上,在配置postcss-loader时,我们配置插件并不需要使用autoprefixer。

我们可以使用另外一个插件:postcss-preset-env

  • postcss-preset-env也是一个postcss的插件;
  • 它可以帮助我们将一些现代的CSS特性,转成大多数浏览器认识的CSS,并且会根据目标浏览器或者运行时环境添加所需的polyfill;
  • 也包括会自动帮助我们添加autoprefixer(所以相当于已经内置了autoprefixer);

首先,我们需要安装postcss-preset-env npm install postcss-preset-env -D

之后,我们直接修改掉之前的autoprefixer即可:

注意:我们在使用某些postcss插件时,也可以直接传入字符串 

webpack.config.js 

const path = require("path")

module.exports = {
  entry: "./src/main.js",
  output: {
    filename: "bundle.js",
    path: path.resolve(__dirname, "./build")
  },
  module: {
    rules: [
      {
        // 告诉webpack匹配什么文件
        test: /\.css$/,
        // use: [ // use中多个loader的使用顺序是从后往前
        //   { loader: "style-loader" },
        //   { loader: "css-loader" }
        // ],
        // 简写一: 如果loader只有一个
        // loader: "css-loader"
        // 简写二: 多个loader不需要其他属性时, 可以直接写loader字符串形式
        use: [ 
          "style-loader",
          "css-loader", 
          "postcss-loader"
          // {
          //   loader: "postcss-loader",
          //   options: {
          //     postcssOptions: {
          //       plugins: [
          //         "autoprefixer"
          //       ]
          //     }
          //   }
          // }
        ]
      },
      {
        test: /\.less$/,
        use: [ "style-loader", "css-loader", "less-loader", "postcss-loader" ]
      }
    ]
  }
}

postcss.config.js

module.exports = {
  plugins: [
    "postcss-preset-env"
  ]
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150722.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot+VUE前后端分离项目学习笔记 - 【17 SpringBoot文件上传下载功能 MD5实现文件唯一标识】

Sql 数据库新建sys_file用来保存上传文件信息 CREATE TABLE sys_file (id int(11) NOT NULL AUTO_INCREMENT COMMENT id,name varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 文件名称,type varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 文…

STM32——I2C通信

文章目录I2C通信使用I2C通信的硬件设备硬件电路I2C时序基本单元起始与终止发送接收发送应答与接收应答I2C时序指定地址写当前地址读指定地址读连续读与写MPU6050简介MPU6050参数硬件电路MPU6050框图系统时钟MPU6050的中断源寄存器映像软件I2C读写MPU6050电路设计关键代码I2C通信…

C语言-扫雷

文章目录完整扫雷1. 说明2. 思路3. 各个功能实现3.1 雷盘初始化与打印1)雷盘定义2) 随机布置雷3.2 玩家排查雷1) 获取坐标周围雷数2) 递归展开3)胜负判断3) 显示雷位置4. 游戏试玩5. 游戏完整代码game.htes…

【定时任务】---- xxl-job、@Scheduled

一、Scheduled注解实现的定时任务 要实现计划任务,首先通过在配置类注解EnableScheduling来开启对计划任务的支持,然后在要执行计划任务的方法上注解Scheduled,声明这是一个计划任务。 在Spring Boot 的入口类 XXXApplication 中,必然会有S…

东南大学洪伟教授评述:毫米波与太赫兹技术

今日推荐文章作者为东南大学毫米波国家重点实验室主任、IEEE Fellow 著名毫米波专家洪伟教授,本文选自《毫米波与太赫兹技术》,发表于《中国科学: 信息科学》2016 年第46卷第8 期——《信息科学与技术若干前沿问题评述专刊》。 本文概要介绍了毫米波与太…

CSS知识点精学6-精灵图、背景图片大小、文字阴影、盒子阴影、过渡

目录 一.精灵图 1.精灵图的介绍 2.精灵图的使用步骤 二.背景图片大小 三.文字阴影 四.盒子阴影 五.过渡 一.精灵图 1.精灵图的介绍 场景:项目中将多张小图片,合成一张大图片,这张图片称之为精灵图 优点:减少服务器发送次…

clickhouse入门学习以及数据迁移

本文主要介绍如何入门clickhouse,以及将mariadb数据迁移过来,最后介绍当前几种的训练的示例数据库集。1、中文教程:中文教程:中文教程有了教程,需要有数据可以训练,教程提供示例数据集,但是数据…

Java基础之《netty(22)—Protobuf》

一、Protobuf基本介绍 1、Protobuf是Google发布的开源项目,全称Google Protobuf Buffers,是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或RPC数据交换格式。 2、参考文档 htt…

粒子系统-主模块参数

目录 Duration Looping Prewarm Start Lifttime Start Speed Start Size 3D Start Rotation Start Rotation Start color Simulation Space Max Particles Duration 粒子系统的工作时长,如果不勾选Looping的话,在5秒后就再也没有粒子发射 L…

HTTPS头部的Referer字段

目录 Referrer-policy 如何设置referer 盗链 防盗链的工作原理 绕过图片防盗链 利用https网站盗链http资源网站,refer不会发送 利用iframe伪造请求referer 利用XMLHttpRequest Referer请求头包含了当前请求页面的来源页面的地址,即表示当前页面是…

【Proteus仿真】【STM32单片机】智能窗帘控制系统设计

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、按键模块、HC05蓝牙、DHT11温湿度、PCF8591 ADC模块、光线传感器、28BYJ48步进电机等。 主要功能: 系统运行后&…

链表算法-回文结构、两个链表公共节点

最近一直在刷算法,以前没有重视这块,偶然巧合下,想到了某几次的面试,虽然没有以这个为主,但是也都有问过算法的题,因为没有这方面的积累,所以心底里一直抗拒,最近也有时间&#xff0…

git第n次学习笔记

git工作流程git四个工作区域Workspace:工作区,就是你平时存放项目代码的地方Index/Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息Repository:仓库区&…

CDGA|想做好数据安全,数据治理是核心

在数字化转型渐进成熟下,企业加强数据治理,保障数据安全,为数字经济持续发展筑牢安全屏障,是时代发展的客观需要。 首先,整个安全能力是在应用内部的,我们对数据流的精确感知和管控,能做到和应用…

【七】Netty JBoss Marshallin 编解码

Netty JBoss Marshallin 编解码介绍Marshallin 开发环境maven 依赖业务场景模拟流程图代码展示订购采购消息 POJO 类订购应答消息 POJO 类SubscribeReqServer 服务端启动类MarshallingCodeCFactory服务端业务处理类 SubscribeServerHandler客户端启动类 SubscribeClient客户端 …

leetcode.2471 逐层排序二叉树所需的最少操作数目 - bfs + 置换环算法 + 并查集

2471. 逐层排序二叉树所需的最少操作数目 目录 1、循环标记置换环 2、并查集置换环 思路: 总操作数目 每一层最小操作数之和 每一层元素个数 - 置换环数 先用bfs对树进行层序遍历,一层一层地计算 置换环:对每个节点,将其指向…

全国首例:新一代仿生型人工心脏在福建成功植入

此时此刻,福建福清吴先生的体内正搏动着一颗新款的“人工心脏”。心脏是生命的中枢,一旦衰竭生命也将终止,人工心脏为这些心衰患者带来了新的希望。福建医科大学附属协和医院心外科团队,将科幻电影里装着人工心脏的“钢铁侠”变成…

六派巨量转移技术概述

1. 巨量转移技术概述 与OLED显示技术不同,无机LED无法在玻璃或其他大尺寸衬底进行大面积的制作,因此需要在半导体衬底上进行制作,然后再转移到驱动背板上。当前LED所采用的衬底一般为蓝宝石,但蓝宝石与外延层之间的晶格和热膨胀系…

国产技术迎来突破,光量子芯片横空出世,中文编程也有好消息

国外光刻机不再牛,随着这项技术问世,我们摆脱芯片卡脖子困境成为可能! 欧美技术如此领先,我们凭什么实现弯道超车?就凭国内领先全球的量子技术,还有惊艳问世的光量子芯片,让欧美震惊不已&#x…

Fossid简介及API接口调用开发

FOSSID简介 FOSSID 是由瑞典FOSSID 公司开发的一款开源代码检测和管理工具,能够全面、准确、高效的发现用户代码库中的开源代码及其风险。 FOSSID 是一个软件解决方案,能够单独部署使用,也可以与现有的开发流程进行无缝集成,能够…