webpack打包笔记

webpack打包

  • 打包bundle:webpack可以帮助我们打包 所以它是一个打包工具

  • 静态的static:这样表达的原因是我们最终可以将代码打包成最终的静态资源(部署到服务器)

  • 模块化module:webpack默认支持各种模块开发

  • 现代的modern

创建全局的webpack

创建 npm init -y

再使用命令:npm install webpack webpack-cli -D
打包命令:npx webpack

=====================================================================================================

如果命名的是main.js(二个文件都命名为main.js),去打包就要用 npx webpack --entry ./src/main.js(自己指定入口)

改变打包的文件名 使用命令 npx webpack --entry ./src/main.js --output-filename bundle.js

改变打包的文件夹的名字 使用命令 npx webpack --entry ./src/main.js --output-filename bundle.js --output-path ./bulid

===================================================================================================== ---以上太麻烦了--------

解决方法: 在src下创建 webpack.config.js文件

  • 在跟目录里面创建一个webpack.config.js文件 const path = require('path');

  • module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") }

  • }

  • 如果把webpack.config.js这个配置文件进行改名 则执行打包要用(npx webpack --config 被改的文件名.config.js)

=====================================================================================================

快捷执行(把webpack.config.js文件放入 package.json中 ---然后输入命令 npm run bundle进行执行)

  • package.js文件 的scripts放入webpack.config.js文件

{

"name": "webpack_basic", "version": "1.0.0", "description": "", "main": "index.js",

  • "scripts": {

    • "build":"webpack --config webpack.config.js"

  • }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "webpack": "^5.86.0", "webpack-cli": "^5.1.4" }

}

  • 然后打包 用 命令 npm run bulid

创建局部的webpack

  • 第一步:创建package.js文件 用于管理项目的信息 库的依赖 npm init

  • 第二步:安装局部的webpack npm install webpack webpack-cli -D

  • 第三步:使用局部的webpack npx webpack

  • 第四步:创建webpack.config.js文件 const path = require('path') //导出信息 module.exports = { entry:"./src/main.js", output:{ filename:"bundle.js", path:path.resolve(__dirname,"./dist") } }

  • 第四步:在package.json中创建script脚本 执行脚本打包即可 "script":{ "build":"webpack" }

  • 执行打包 : npm run build

webpack --loader(打包css文件)

  • 安装命令: npm install css-loader -D

  • 第一步:在src/创建一个文件夹(component/ div_cpn.js写入代码:)

  • import "../css/div_style.css"

const divEl = document.createElement("div") //添加css divEl.textContent = "Hello word" divEl.classList.add("content")

  • document.body.append(divEl)


  • 第二步:把上面写的导入到main.js中

  • import { sum } from "./utils/main.js" import "./component/div_cpn.js" //引入js 入口文件 console.log(sum(10 , 20))

const result = () => { console.log("你好呀!!!") }

  • result()

  • 第三步:在webpack.config.js里面配置css-loader const path = require('path'); module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") },

  • module:{ rules:[ //匹配规则 { //告诉webpack匹配什么文件 test:/.css$/, use:[ { loader:"css-loader" } ] } ]

  • } }

npm run build 发现没有效果

  • 解决办法:安装指令 : npm install style-loader -D 在配置: const path = require('path'); module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") }, module:{ rules:[ //匹配规则 { //告诉webpack匹配什么文件 test:/.css$/,

  • use:[ //执行顺序是从后前的

  • { loader:"style-loader" },

  • { loader:"css-loader" } ] } ] } }

在执行打包文件: npm run build

===================================================================================================== 如何处理less

  • 安装命令: npm install less-loader -D

  • 第一步:在src/css里创建title_style.less文件 写入代码: @fontSize:50px; @fontColor:blue;

.title { font-size: @fontSize; color:@fontColor; }

  • 第二步:引入到 div_cpn.js中 import "../css/div_style.css" import "../css/title_style.css" //引入less文件

const divEl = document.createElement("div") //添加css divEl.textContent = "Hello word" divEl.classList.add("content")

document.body.append(divEl)

//创建h2元素 const titleEl = document.createElement("h2") titleEl.textContent = "呵呵呵呵"

titleEl.classList.add("title") document.body.append(titleEl)

  • 第三步:在webpack.config.js里面配置less文件 const path = require('path'); module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") }, module:{ rules:[ //匹配规则 { //告诉webpack匹配什么文件 test:/.css$/, use:[ //执行顺序是从后前的 { loader:"style-loader" }, { loader:"css-loader" } ] }, //处理less文件

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

  • } ] } }

=====================================================================================================

postcss-loader 解决一些样式要添加浏览器前缀的问题

  • 安装指令: npm install postcss-loader -D

  • 在安装:npm install autoprefixer -D

在webpack.config.js中配置如下: const path = require('path'); module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") }, module:{ rules:[ //匹配规则 { //告诉webpack匹配什么文件 test:/.css$/, use:[ //执行顺序是从后前的 { loader:"style-loader" }, { loader:"css-loader" } ,

  • { loader:"postcss-loader", options:{ postcssOptions:{ plugins:[ "autoprefixer" ]

       }

    } } ]

  • }, //处理less文件 { test:/.less$/, // use:[ // { loader:"style-loader" }, // { loader:"less-loader" } // ] //简写 use:["style-loader" , "css-loader" , "less-loader"] } ] } }

对postcss-loader进行抽离

第一步:在src下创建:一个文件 postcss.config.js module.exports = { plugins:[ "autoprefixer" ] }

第二步:在webpack下写入 const path = require('path'); module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") }, module:{ rules:[ //匹配规则 { //告诉webpack匹配什么文件 test:/.css$/, use:[ //执行顺序是从后前的 { loader:"style-loader" }, { loader:"css-loader" } ,

  • { loader:"postcss-loader"} ---->简写 // { // loader:"postcss-loader", // options:{ // postcssOptions:{ // plugins:[ // "autoprefixer" // ] // } // } // } ] }, //处理less文件 { test:/.less$/, // use:[ // { loader:"style-loader" }, // { loader:"less-loader" } // ] //简写 use:["style-loader" , "css-loader" , "less-loader"] } ] } }

  • 在npm run build 打包

postcss-preset-env 预设插件

使用这个卸载掉 autoprefiexer(使用命令: npm uninstall autoprefixer)

  • 安装另外一个新的插件: 命令: npm install postcss-preset-env -D

  • 修改配置 postcss.config.js module.exports = { plugins:[ "postcss-preset-env" ] }

=====================================================================================================

打包图片

  • 代码(div_cpn.js) import "../css/div_style.css" import "../css/title_style.css" //引入less文件 //引入图片模块 import tq from "../img/t1.png" const divEl = document.createElement("div") //添加css divEl.textContent = "Hello word" divEl.classList.add("content")

document.body.append(divEl)

//创建h2元素 const titleEl = document.createElement("h2") titleEl.textContent = "呵呵呵呵"

titleEl.classList.add("title") document.body.append(titleEl)

//创建img元素 const imgEl = document.createElement("img") imgEl.src = tq

  • document.body.append(imgEl)

  • 执行 npm run build 报错

解决方法 在webpack.config.js里面配置处理图片的loader

const path = require('path'); module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") }, module:{ rules:[ //匹配规则 { //告诉webpack匹配什么文件 test:/.css$/, use:[ //执行顺序是从后前的 { loader:"style-loader" }, { loader:"css-loader" } , { loader:"postcss-loader"} // { // loader:"postcss-loader", // options:{ // postcssOptions:{ // plugins:[ // "autoprefixer" // ]

            //         }
            //     }
            // }
        ]
      },
      //处理less文件
      {
         test:/\.less$/,
        //  use:[
        //     { loader:"style-loader" },
        //     { loader:"less-loader" }
        //  ]
        //简写
        use:["style-loader" , "css-loader" , "less-loader" , "postcss-loader"]
      },
  • // 处理图片文件 { test:/.(png|jpe?g|svg|gif)$/, type:"asset"

  • } ] } }

引入知识点:

-- 资源模块类型(assent module type),通过添加4种新的模块类型 来替代所有的这些 loader 1.assent/resource 发送一个单独的文件并导出URL -老版本之前是用file-loader来实现 2.asset/inline 导出一个资源data URL -老版本之前是用url-loader来实现 3.assent/source 导出资源的源代码 -老版本之前是用raw-loader来实现 4.assent 在导出一个data url 和发送一个单独文件之间自动选择 -老版本之前是用url-loader来实现

=====================================================================================================

使用背景图片

  • 在div_cpn.js里面写入代码 import "../css/div_style.css" import "../css/title_style.css" //引入less文件 import "../css/bg_style.css" //引入背景图 //引入图片模块 import tq from "../img/t1.png" const divEl = document.createElement("div") //添加css divEl.textContent = "Hello word" divEl.classList.add("content")

document.body.append(divEl)

//创建h2元素 const titleEl = document.createElement("h2") titleEl.textContent = "呵呵呵呵"

titleEl.classList.add("title") document.body.append(titleEl)

//创建img元素 const imgEl = document.createElement("img") imgEl.src = tq document.body.append(imgEl)

//创建div元素 设置背景 const divBgEl = document.createElement("div") divBgEl.classList.add("img-bg") document.body.append(divBgEl)

  • 在css文件夹新建一个bg_style.css中写入样式 .img-bg { width: 500px; height: 500px; background: url(../img/t2.png)no-repeat; }

  • 运行代码 : npm run build

  • webpack.config.js的配置如下: const path = require('path'); module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") }, module:{ rules:[ //匹配规则 { //告诉webpack匹配什么文件 test:/.css$/, use:[ //执行顺序是从后前的 { loader:"style-loader" }, { loader:"css-loader" } , { loader:"postcss-loader"} // { // loader:"postcss-loader", // options:{ // postcssOptions:{ // plugins:[ // "autoprefixer" // ]

              //         }
              //     }
              // }
          ]
        },
        //处理less文件
        {
           test:/\.less$/,
          //  use:[
          //     { loader:"style-loader" },
          //     { loader:"less-loader" }
          //  ]
          //简写
          use:["style-loader" , "css-loader" , "less-loader" , "postcss-loader"]
        },
        {
          test:/\.(png|jpe?g|svg|gif)$/,
  • //type:"asset/resource" //打包这两张图片 并且这两张图片有自己的地址 将地址设置到img/bg中

  • type:"asset/inline" // 将图片做了base64的编码 } ] } }

=====================================================================================================

url-loader的limit效果

  • 目的:小的图片需要转换 大的图片之间请求

  • 使用步骤: --1.将type 修改成asset --2.添加一个parser属性 并且制定dataUrl的条件 添加maxSize属性 const path = require('path'); module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") }, module:{ rules:[ //匹配规则 { //告诉webpack匹配什么文件 test:/.css$/, use:[ //执行顺序是从后前的 { loader:"style-loader" }, { loader:"css-loader" } , { loader:"postcss-loader"} // { // loader:"postcss-loader", // options:{ // postcssOptions:{ // plugins:[ // "autoprefixer" // ]

             //         }
             //     }
             // }
         ]
       },
       //处理less文件
       {
          test:/\.less$/,
         //  use:[
         //     { loader:"style-loader" },
         //     { loader:"less-loader" }
         //  ]
         //简写
         use:["style-loader" , "css-loader" , "less-loader" , "postcss-loader"]
       },
       {
         test:/\.(png|jpe?g|svg|gif)$/,
         //type:"asset/resource" //打包这两张图片 并且这两张图片有自己的地址 将地址设置到img/bg中 缺点:就是多两张图片的网络请求
         // type:"asset/inline" // 将图片做了base64的编码 缺点:造成js文件非常的大 造成js代码的下载和解析时间过长
    ​
         //3.合理规范
         //3.1 对于小一点的图片 可以进行base64的编码
         //3.2 对于大一点的图片 单独打包形成了url地址
  • type:"asset",

  • parser:{

  • dataUrlCondition:{

  • maxSize:60 * 1024 //设置图片类型的打包

  • }

  • },

  • generator:{ //占位符 //name:指向原来的图片名称 //ext拓展名 filename:"[name]_hash" } } ]

  • } }

=====================================================================================================

对js的打包

  • ES6 代码转换成ES6的代码 要用babel 安装babel指令: npm install babel-loader -D npm install @babel/plugin-transform-arrow-functions ....等等代码指令

  • 在webpack.config.js里面配置 { test:/.js$/, use:[ // "babel-loader" { loader:"babel-loader", // options:{ // plugins:[ // "@babel/plugin-transform-arrow-functions" // ] // } }, ] }

----太麻烦了 ----

  • 使用babel预设 babel.config.js

  • 创建babel.config.js文件(写入代码) module.exports = { plugins:[ "@babel/plugin-transform-arrow-functions" ] }

  • 安装babel的预设 (安装指令:npm install @babel/preset-env)

  • 将babel.js文件改为: module.exports = { // plugins:[ // "@babel/plugin-transform-arrow-functions" // ]

    presets:[ "@babel/preset-env" ] }

=====================================================================================================

对vue的打包

  • 第一步:在src/创建vue_demo文件 写入代码

<template> <div class="contents">{{ msg }}</div> <p class="p">jjj</p> </template>

<script> export default { data() { return { msg:"你好哈哈哈" } } } </script>

<style> .contents { font-size: 50px; color: 20px; }

.p { font-size: 20px; color: 15px; } </style>

  • 第二步:把Hello.vue组件导入到main.js中 // 导入vue组件 import { createApp } from 'vue' import Hello from "./vue_demo/hello.vue"

//vue代码 createApp(Hello)

  • 第三步:在index.html中挂载

  • 第四步:安装vue指令loader: npm install vue-loader -D

=====================================================================================================

  • 第五步:在webpack.config.js里面配置 const path = require('path');

  • const { VueLoaderPlugin } = require("vue-loader/dist/index")

module.exports = { entry:"./src/main.js", //入口 output:{ //出口 filename:"bundle.js", path:path.resolve(__dirname,"./bulid") }, module:{ rules:[ //匹配规则 { //告诉webpack匹配什么文件 test:/.css$/, use:[ //执行顺序是从后前的 { loader:"style-loader" }, { loader:"css-loader" } , { loader:"postcss-loader"} // { // loader:"postcss-loader", // options:{ // postcssOptions:{ // plugins:[ // "autoprefixer" // ]

            //         }
            //     }
            // }
        ]
      },
      //处理less文件
      {
         test:/\.less$/,
        //  use:[
        //     { loader:"style-loader" },
        //     { loader:"less-loader" }
        //  ]
        //简写
        use:["style-loader" , "css-loader" , "less-loader" , "postcss-loader"]
      },
      {
        test:/\.(png|jpe?g|svg|gif)$/,
        //type:"asset/resource" //打包这两张图片 并且这两张图片有自己的地址 将地址设置到img/bg中 缺点:就是多两张图片的网络请求
        // type:"asset/inline" // 将图片做了base64的编码 缺点:造成js文件非常的大 造成js代码的下载和解析时间过长
​
        //3.合理规范
        //3.1 对于小一点的图片 可以进行base64的编码
        //3.2 对于大一点的图片 单独打包形成了url地址
​
        type:"asset",
        parser:{
          dataUrlCondition:{
            maxSize:60 * 1024 //设置图片类型的打包
          }
        },
        generator:{
          //占位符
          //name:指向原来的图片名称
          //ext拓展名
          filename:"[name]_[hash][ext]"
        }
      },
      // 把ES6 转成成 ES5代码
      // {
      //   test:/\.js$/,
      //   use:[
      //     { 
      //       loader:"babel-loader",
      //       // options:{
      //       //   plugins:[
      //       //     "@babel/plugin-transform-arrow-functions"
      //       //   ]
      //       //   }
      //     },
          
      //   ]
      // }
      {
        test: /\.vue$/,
        loader: 'vue-loader'
      }
    ]
},
  • plugins:[ new VueLoaderPlugin()

  • ] }

安装@vue/compiler-sfc ---解析vue文件

指令:npm install @vue/compiler-sfc -D

在执行 npm run build

=====================================================================================================

extensions和alias的配置

1.extensions是解析文件是自动添加的扩展名: -默认值是['.wasm','.mjs','.js','.json'] 所以如果我们要添加加载.vue或者jsx 或者 ts等文件时,我们必须自己写扩展名

2.另一个非常好用的功能是配置别名alias -特别是当我们项目的目录结构比较深的时候 或者一个文件的路径可能需要 ../../../这中路径片段 --相当于别名

  • 在webpack.config.js里面配置resolve可以解决引入后缀名的繁琐 module.exports = { // 配置resolve resolve:{ extensions:[".js",".json",".vue",".jsx",".ts",".tsx"] }, }

如果是文件夹会根据resolvemainFiles配置选项中指定的文件顺序查找

-1.resolve.mainFiles的默认值是['index'] -2在根据resolve.extensions来解析扩展名

alias配置别名

--在webpack.config.js里面配置 module.exports = { // 配置resolve resolve:{ extensions:[".js",".json",".vue",".jsx",".ts",".tsx"], // 配置别名:作用:解决查找路径的繁琐 alias:{ utils:path.resolve(__dirname,"./src/utils") } } }

=====================================================================================================

webpack插件

1.认识Plugin ---loader是用于特定的模块类型进行转换 ---Plugin可以用于更加广泛的任务 比如打包优化 资源管理 环境注入

  • CleanWebpackPlugin ===> 自动删除dist文件夹 使用: 安装命令: npm install clean-webpack-plugin-D

再webpack.config.js里面配置

  • const { CleanWebpackPlugin } = require('clean-webpack-plugin')

  • module.exports = { plugins:[ new CleanWebpackPlugin() ]

  • }

=====================================================================================================

使用html-webpack-plugin插件 ---自动生成html文件

-安装指令:npm install html-webpack-plugin -D ---webpack.config.js里面的配置 const HtmlWebpackPlugin = require("html-webpack-plugin")

  • module.exports = { plugins:{ new CleanWebpackPlugin(), new HtmlWebpackPlugin({ title:"电商项目", template:"./src/index.html" //自己指定打包模板 }) }

  • }

=====================================================================================================

DefinePlugin的介绍(也可以默认注入变量)

-场景:在模板里面使用了一个BASE_URL的变量 ---> 报错 -使用DefinePlugin插件

  • 在webpack.config.js里面配置 const { DefinePlugin } = require('webpack') module.exports = { plugins:[ new DefinePlugin({ BASE_URL:'"./"' }) ] }

=====================================================================================================

Mode的配置(模式的配置)

---Mode配置选项 默认值是:production(什么都不设置的情况下) 可选值:'none' | 'development' | 'production'

  • 在webpack.config.js里面配置 module.exports = { mode:"production", //开发阶段 }

=====================================================================================================

webpack本地服务器的配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值