一文搞懂Webpack

90 阅读2分钟

Webpack是什么

Webpack是一个模块打包工具,把相互依赖的html、css、javacript、图片、字体经过一系列的处理,打包成静态的前端项目。

好处

以往的项目开发中,需要通过在html中引入大量的javascript、css等文件,会导致命名冲突、体积变大等问题。在nodejs出现后,可以通过require进行模块化开发,并且支持npm方便管理依赖。使用webpack用来将nodejs的模块化代码构建成浏览器可执行的代码。

使用

创建

  1. 创建一个目录,可命名为webpackLearning
  2. cd到当前目录,执行npm init -y
  3. 还是当前目录,执行npm add webpack webpack-cli --dev
  4. 在根目录创建一个src源文件目录,在src下创建index.js写入console.log("hello world")
  5. 在根目录创建index.html文件,在通过script标签引入刚刚创建的index.js
  6. 通过live server(vscode插件)执行html文件。控制台显示打印hello world
  7. 回到cmd,执行npx webpack打包命令
  8. 打包后发现生成了dist文件夹,文件夹中包含一个main.js文件

核心:配置文件

webpack.config.js文件

const path=require("path")
module.exports={
 mode:"development",
 entry:"./src/index.js",
 output:{
   filename:'dist.js',
   path:path.resolve(__dirname,"dist")
 }
}

形成基础配置,分别问开发模式,入口文件路由,输出文件名以及输出文件路径

添加loader

我们在src目录下创建一个style.css文件,并在index.js文件中导入使用,打包发生爆错,因为没有引入对应的loader,我们在控制台执行npm add --dev style-loader css-loader. 在配置文件中做如下改动,用来将.css后缀的文件,与我们的loader联系起来

const path=require("path")
module.exports={
 mode:"development",
 entry:"./src/index.js",
 output:{
   filename:'dist.js',
   path:path.resolve(__dirname,"dist")
 },
 module:{
   rules:[
     {
       test:/\.css$/i,
       use:["style-loader","css-loader"]
     }
   ]
 }
}
const path=require("path")
const HtmlWebpackPlugin=require("html-webpack-plugin")  //用于自动生成html文件
const TerserPlugin=require("terser-webpack-plugin")     //用于将打包后的代码进行压缩
const BundleAnalyzerPlugin=require("webpack-bundle-analyzer")  //用户webpack打包项目的可视化
module.exports={
 mode:"development",        //开发模式
 devtool:"inline-source-map",   
 entry:"./src/index.js",       //入口文件
 output:{             
   // filename:'[name].[contenthash].js',  //为了避免浏览器缓存,可生成随机的打包后的文件名
   filename:'dist.js',    //静态写死的文件名
   path:path.resolve(__dirname,"dist")        //打包文件路径
 },
 optimization:{   //压缩配置项
   minimize:true,    //是否压缩
   minimizer:[new TerserPlugin()]  //使用导入的插件
 },
 devServer:{
   static:"./dist",         //配置为代码改动后自动更新
 },
 plugins:[
   new HtmlWebpackPlugin({
     title:"blogList"
   }),               //自动生成html的配置
   new BundleAnalyzerPlugin.BundleAnalyzerPlugin()   //可视化工具配置
 ],
 module:{
   rules:[
     {
       test:/\.css$/i,         //正则匹配.css后缀的文件
       use:["style-loader","css-loader"]   //使用响应的loader
     },
     {
       test:/\.(png|svg|jpg|jpeg|gif)$/i,
       type:"asset/resource",           //内置了对图片静态资源的解析器
     },
     {
       test:/\.js$/,
       exclude:/node_modules/,    //排除node_modules
       use:{
         loader:"babel-loader",
         options:{
           presets:["@babel/preset-env"]
         }
       }
     }
   ]
 }
}

引入的依赖(通过npm add --dev导入的): package.json文件中

{
  "name": "webpacklearning",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "start": "webpack serve --open"    //可通过npm start启动
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@babel/core": "^7.24.0",     
    "@babel/preset-env": "^7.24.0",  //向低版本兼容
    "babel-loader": "^9.1.3",
    "css-loader": "^6.10.0",           //css的loader
    "html-webpack-plugin": "^5.6.0",     //自动生成html的依赖
    "style-loader": "^3.3.4",          
    "terser-webpack-plugin": "^5.3.10",  //压缩依赖
    "webpack": "^5.90.3",
    "webpack-bundle-analyzer": "^4.10.1",    //可视化工具依赖
    "webpack-cli": "^5.1.4",
    "webpack-dev-server": "^5.0.2"   
  }
}