day28JS+Node-JS打包工具Webpack

1. 什么是Webpack

在 Node.js 环境下使用的 Webpack 是一个基于 JavaScript 的 静态模块打包工具(Static Module Bundler),它运行在 Node.js 环境中,但主要用于构建和优化前端项目(如 React、Vue 等)。

Webpack 是一个 npm 包 (通过 npm install webpack 安装),运行在 Node.js 环境中,但生成的是前端代码(如浏览器可运行的 JS、CSS、HTML)。

2. Webpack 的核心功能

  • 将分散的前端模块(JS、CSS、图片等)打包成少数优化后的文件。

  • 处理依赖关系、代码转译(如 Babel)、资源加载(如 CSS/图片)等。

3. Webpack基本配置

3.1 以下是需要下载的插件

javascript 复制代码
1.webpage拷贝插件
"copy-webpack-plugin": "^6.4.1",

2.webpack的html生成插件
"html-webpack-plugin": "^4.5.1",

3.webpack插件
"webpack": "^4.46.0",

4.webpack命令插件
"webpack-cli": "^3.3.12",

5.webpack静态服务插件
"webpack-dev-server": "^3.11.2"

6.art模板和模板加载插件
"art-template":"^4.13.2"
"art-template-loader":"^1.4.3"

7.用于清除因配置hash名而产生上次生成的同样文件
"clean-webpack-plugin":"^3.0.0"

8.用于对于js中import引入的css做解析
"css-loader":"^5.0.2"
"style-loader":"^1.3.0"

9.页面用bootstrap框架
 "bootstrap": "^4.6.0",

10. 基于jquery
  "jquery": "^3.5.1",

11.前端页面使用的router路由  
  "sme-router": "^0.12.8"

3.2 webpack4 具体的配置信息

先创建一个webpack.config.js ,webpack4 具体内容如下:

javascript 复制代码
var path = require("path");
var HtmlWebpackPlugin = require("html-webpack-plugin");
var CopyPlugin = require("copy-webpack-plugin");
var {CleanWebpackPlugin}=require("clean-webpack-plugin");
module.exports = {
  1. 开发环境或者生产环境
  mode: "development",
 
  2. 生成map映射文件,当项目被打包后会压缩,
  // 有这个map文件就可以更精准的知道是哪个地方出现了错误
  devtool: "source-map",

  3. 限制打包文件内容过大
  performance: {
    hints: false
  },
  4. 入口,在整个html页面中执行的入口js文件
  //前面是编译过的地址,后面是编译前的地址
  entry: {
     "js/app": "./src/app.js"
  },
  5. 出口配置,自动生成压缩后的文件夹
  output: {
    // 输出路径
    path: path.join(__dirname, "./dist"),
    // 输出生成的js文件,在这里[name]是原文件名是什么就导出对应的名字
    //[hash:6] 自动增加尾缀hash值用来区分上一次的文件,减少因为缓存引入上次的文件问题
    filename: "[name]-[hash:6].js"
  },
  6.模块
  module: {
    rules: [
       //配置art-template-loader模块,用于加载所有.art的文件并且根据需求加载完成后解析
      { test: /\.art$/, use: { loader: "art-template-loader" } },
      //配置CSS文件的import引入和解析
      { test: /\.css$/i,use: ["style-loader", "css-loader"] }
    ]
  },
  7. webpage提供的插件
  plugins: [
    // 用于自动构建html页面的插件
    new HtmlWebpackPlugin({
      // 网页源目录
      template: path.join(__dirname, "./public/index.html"),
      // 目标文件名
      app: "index.html",
      // 注入js
      inject: true
    }),
    8. 用于复制源文件夹中指定的文件
    new CopyPlugin({
      // 插件配置  from从某文件夹复制,to到某文件夹
       patterns: [
        { "from": "./public/img", "to": path.join(__dirname, "./dist/img/") },
        { "from": "./public/css", "to": path.join(__dirname, "./dist/css/") },
        { "from": "./public/js", "to": path.join(__dirname, "./dist/js/") },
        { "from": "./public/fonts", "to": path.join(__dirname, "./dist/fonts/") }
      ]
    }),
    9.清除上次因为使用hash名称产生的相同文件   "[name]-[hash:6].js"这里配置造成
    new CleanWebpackPlugin()
  ],
  10. 设置服务配置,开启静态服务
  devServer: {
    // 目标静态服务器地址指向的文件夹
    contentBase: path.join(__dirname, "./dist"),
    // 端口号
    port: 4001,
    //设置代理服务,解决跨域问题
    proxy:{
       "/api":{
          target:"http://localhost:3000"
       }
    }
  }
}

3.3 webpack5 具体的配置信息

javascript 复制代码
webpack5具体配置如下:
import path from "path";
import HTMLWebpackPlugin from "html-webpack-plugin";
import {CleanWebpackPlugin} from "clean-webpack-plugin";
export default {
  1. 开发环境或者生产环境
    mode:"production",
  2.生成map映射文件,当项目被打包后会压缩,
  // 有这个map文件就可以更精准的知道是哪个地方出现了错误
    devtool:"source-map",
  3. 取消限制打包文件内容过大
    performance: {
        hints: false
    },
 4. 入口,在整个html页面中执行的入口js文件
  //前面是编译过的地址,后面是编译前的地址
    entry:{
        "./js/app":"./src/index.js"
    },
 5. 出口配置,自动生成压缩后的文件夹
    output:{
        // 输出路径
        path:path.join(path.resolve(),"./dist"),
        // 输出生成的js文件,在这里[name]是原文件名是什么就导出对应的名字
        //[hash:] 自动增加尾缀hash值用来区分上一次的文件,减少因为缓存引入上次的文件问题
        filename:"[name]-[fullhash].min.js"
    },
    module:{
        rules:[
            //配置解析stylus,并且导入
            {test:/\.styl$/i,use:["style-loader","css-loader","stylus-loader"]},
           //配置解析art
             {test:/\.art$/i,use:{loader:"art-template-loader"}},
            //配置解析svg格式文件
            {test:/\.svg$/i,type: 'asset'}
        ]
    },
    plugins:[
      // 用于自动构建html页面的插件
        new HTMLWebpackPlugin({
            // 网页源目录
            template:path.join(path.resolve(),"./src/index.html"),
            // 注入js
            inject:true
        }),
        6.清除上次因为使用hash名称产生的相同文件   "[name]-[fullhash].js"这里配置造成
        new CleanWebpackPlugin()
    ],
    devServer:{
        7.创建静态服务资源
        static:{
            //静态资源路径
            directory:path.join(path.resolve(),"./public"),
            //服务器打开路径
            publicPath:path.join(path.resolve(),"./dist")
        },
       8.端口号
        port:5500,
        //代理
        //因为通信中可能要考虑向不同的服务器通信,因此在这里配置访问代理时
        //在路径中加入指向服务别名 http://localhost:5500/a/user/login
        //实际我们访问的应该是 http://localhost:4000/user/login
        //这里的a就是代表不同服务器的别名,访问5500端口号就会根据这个别名
        //指向对应的localhost:4000的地址,保留后面的/user/login路由
        proxy:{
            //设置代理服务,解决跨域问题
            "/a":{
                target:"http://localhost:4000",
                //把/a清除掉
                pathRewrite:{"/a":""}
            }
        }
    }
}

3.3 配置script中的命令

javascript 复制代码
"scripts": {
    1.用于执行webpack打包项目
    "build": "npx webpack",
    2.webpack4中使用用于开启webpack静态服务
    "dev": "npx webpack-dev-server"
    3.webpack5中使用用于开启静态服务,并且提供静态路径
    "dev": "webpack serve --static"
  }

3.4 网页中的静态路径配置

javascript 复制代码
public
  img
  css
src
  views
  app.js

4. webpack5 配置实践

4.1 配置package.json

1.正在项目目录下执行npm init -y初始化文件。

2.编写package.json,配置依赖。

javascript 复制代码
{
  "name": "0920",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  2.配置启动命令
  "scripts": {
    "start": "cross-env mode=development webpack serve --static",
    "dev": "cross-env mode=development webpack",
    "des": "cross-env mode=production webpack"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    5. 配置clean-webpack-plugin,用于在每次构建前清理/删除输出目录的 Webpack 插件,确保输出目录只包含当前构建生成的文件,避免旧文件残留。
    "clean-webpack-plugin": "^4.0.0",
    "cross-env": "^7.0.3",
    7,配置解析css插件
    "css-loader": "^7.1.2",
    3. 配置html-webpack-plugin,是 Webpack 的一个核心插件,用于简化 HTML 文件的创建
    "html-webpack-plugin": "^5.6.0",
     6,配置解析style插件
    "style-loader": "^4.0.0",
    "stylus": "^0.63.0",
    "stylus-loader": "^8.1.1",
     1.配置webpack的依赖
    "webpack": "^5.94.0",
    "webpack-cli": "^5.1.4",
    4,配置webpack-dev-server 是 Webpack 官方提供的开发服务器工具,它为前端开发提供了实时重新加载(live reloading)和模块热替换(HMR)等功能,极大提高了开发效率。
    "webpack-dev-server": "^5.1.0"
  },
  "dependencies": {
    "axios": "^1.7.7"
  }
}

执行npm i 下载依赖。

4.2 准备内容

  1. 在项目目录下新建src和public文件夹。在src文件夹下新建一个index.js文件、一个components文件夹和stylus文件夹。在components文件夹下新建一个Box.js文件和Ball.js文件。
  1. 编写Box.js文件和和Ball.js文件。
javascript 复制代码
Box.js文件:
export default class Box{
    constructor(){

    }
    play(){
        console.log("play");
    }
}
javascript 复制代码
Ball.js文件:
import Box from "./Box.js";

export default class Ball extends Box{
    constructor(){
        super()
    }
    run(){
        console.log("run");
    }
}
  1. 编写index.js文件
javascript 复制代码
import Ball from "./components/Ball.js";
import axios from "axios";
import "./stylus/main.styl";
var b=new Ball();
b.play();
b.run();
console.log("c");

axios.get("http://localhost:5200/a/users").then((result)=>{
    console.log(result);
})
  1. 在stylus文件夹下新建main.styl文件
css 复制代码
w=150px;
set-block(w=50px,h=50px,c=red){
    width w;
    height: h;
    background-color: c;
}
.div1
    set-block(w,w)
  1. 在public文件夹中新建一个css文件夹和html文件夹。在css文件夹新建一个a.css。在html文件夹新建一个indx.html文件。
css 复制代码
a.css:

div{
    color:white;
}
html 复制代码
index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="/css/a.css">
</head>
<body>
    <div class="div1">页面</div>
</body>
</html>

4.3 配置webpack.config.js

  1. 在根目录下新建一个webpack.config.js的文件。
javascript 复制代码
import path from "path";
4.引入html-webpack-plugin,用于简化 HTML 文件的创建
import HTMLWebpackPlugin from "html-webpack-plugin";
6.引入clean-webpack-plugin,用于每次构建前清理/删除上一次自动生成的文件。
import { CleanWebpackPlugin } from "clean-webpack-plugin";
export default {
   3. 配置是运行环境,否压缩内容,process是没有压缩的,development是压缩的,
    两种都配置需要在package.json文件中配置"script"
    mode: process.env.mode,
    8.定位文件中报错代码的位置,会在dist/js文件下生成一个.map的文件。
    devtool: "source-map",
   1.配置入口文件
    entry: {
        入口文件的key:入口文件路劲
        "./js/main": "./src/index.js"
    },
   2.将入口文件中的所有内容打包在根路径的dist文件路劲下,并取名为min.js
    output: {
        path: path.join(path.resolve(), "./dist"),
        [name]:表示入口文件的key。[hash:6]:表示生成随机的6位哈希码。min:表示压缩
        filename: "[name]-[hash:6].min.js"
    }, 这样配置生成的文件应该在dist/js/main-6ba25a.main.js。6ba25a就是随机生成的6位哈希码,这样就保证了每次生成的文件名不一样。
     
    5.使用html-webpack-plugin
    plugins: [
        new HTMLWebpackPlugin({
            5.1 配置使用模板的路劲
            template: path.join(path.resolve(), "./public/html/index.html"),
            5.2 将刚才生成好的min.js注入到index.html
            inject: true
        }),
        7.使用clean-webpack-plugin自动清除
        new CleanWebpackPlugin()
    ],
    8. 使用解析styl插件
    module: {
        rules: [
            { test: /\.styl$/, use: ["style-loader", "css-loader", "stylus-loader"] }
        ]
    },
    6. 使用的配置webpack-dev-server 
    devServer: {
        端口号
        port: 5200,
       
        static: {
            配置静态资源目录的路劲
            directory: path.join(path.resolve(), "./public"),
            静态资源生成的位置
            publicPath: path.join(path.resolve(), "./dist")
        },
        配置代理
        proxy: [
            {   // 匹配需要代理的请求路径(所有以/a开头的请求)
                context: ['/a'],
                // 目标服务器地址(后端API地址)
                target: 'http://124.70.31.133:4000',
                // 路径重写规则:将请求路径中的/a替换为空字符串 
                pathRewrite: { '^/a': '' },
            }
        ]
    }
}

4.4 配置scripts

10.在package.json中配置多个运行环境

javascript 复制代码
{
   ....
  "scripts": {
    "start": "cross-env mode=development webpack serve --static",
    "dev": "cross-env mode=development webpack",
    "des": "cross-env mode=production webpack"
  },
....
}

启动项目 是会根据启动的命令 进行执行不同的启动环境

例如:

npm run stsrt 启动的就是 "start": "cross-env mode=development webpack serve --static"。

npm run dev 启动的就是 "dev": "cross-env mode=development webpack"。

npm run des 启动的就是 "des": "cross-env mode=production webpack"。

  1. 执行npm run dev 就在生成了dist文件夹。
  1. 运行npm run start 。

  2. 访问地址:

相关推荐
年纪轻轻只想躺平12 分钟前
Vue2部分知识点和注意项
前端·javascript·vue.js
多则惑少则明1 小时前
Vue开发系列——Vue 生命周期钩子 及常见知识点
前端·javascript·vue.js·前端框架
菥菥爱嘻嘻2 小时前
JS手写代码篇---Pomise.race
开发语言·前端·javascript
南瓜胖胖2 小时前
【R语言编程绘图-调色】
开发语言·r语言
lanbing3 小时前
非常适合初学者的Golang教程
开发语言·后端·golang
CodeCipher3 小时前
前端Vue3列表滑动无限加载实现
前端·javascript·vue.js·vue
十碗饭吃不饱4 小时前
vue修改配置文件.env.development不生效
前端·javascript·vue.js
stormsha4 小时前
GO语言进阶:掌握进程OS操作与高效编码数据转换
开发语言·数据库·后端·golang·go语言·源代码管理
老神在在0015 小时前
javaEE1
java·开发语言·学习·java-ee
魔道不误砍柴功5 小时前
《接口和抽象类到底怎么选?设计原则与经典误区解析》
java·开发语言