webpack

定义: 本质上,webpack是一个用于现代JavaScript应用程序的静态模块打包工具。当webpack处理应用程序时,它会在内部从一个或多个入口点构建一个依赖图(dependencygraph),然后将你项目中所谥的每一个模块组合成一个或多个bund/es,它们均为静态资源,用于展示你的内容。

静态模块:指的是编写代码过程中的,html, C55, jS,图片等固定内容的文件

打包:把静态模块内容,压缩,整合,转译等(前端工程化)

  • / 把less / sass转成css代码
  • /把ES6+降级成ES5
  • /支持多种模块标准语法

问题:为何不学vite?

因为:很多项目还是基于Webpack构建,并为Vue,React脚手架使用做铺垫!

check.js

javascript 复制代码
export const checkPhone = phone => phone.length === 11
export const checkCode = code => code.length === 11

check.js在util文件夹里,外面加一个index.js文件,没有在package,json里面配置 type,用ECMAScript会报错

接下来npm i webpack webpack-cli --save-dev

npm run build

index.js

javascript 复制代码
//目标1:体验 webpack 打包过程
// 1.1 准备项目和源代码
import { checkPhone, checkCode } from './utils/check.js' console.log(checkPhone('13900002020'))
console.log(checkCode('123123123123'))
// 1.2 准备 webpack 打包的环境
// 1.3运行自定义命令打包观察效果(npm run 自定义命令)

package.json

修改webpack打包入口出口

温馨提示,本节讲的修改入口写法都是基于commonJS的

概念 | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com),打开入口

javascript 复制代码
webpack.config.js

module.exports = {
  entry: './path/to/my/entry/file.js',
};
javascript 复制代码
webpack.config.js

const path = require('path');

module.exports = {
  entry: './path/to/my/entry/file.js',
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: 'my-first-webpack.bundle.js',
  },
};

前面用 es 标准这里又用 commonjs 卡了我好久啊。在2024年这种写法会出错,24年那个导出和导入语法必须用一样的,老师这样会报错

重新打包观察,这里有报错可能是因为es6规范与commonjs规范冲突,加了"type": "module"要使用es6规范,而且es6规范里面没有直接注入变量__dirname,需要const __dirname = path.resolve();

在webpack.config.js可以在output里面加一个clean:true来生成打包后内容,清空输出目录

用户登录案例-长度判断

脚手架就是自动帮我们构建项目的工具,比如vue2的脚手架就是vue-cli

Node.js与Webpack-18.案例-用户登录-长度判断_哔哩哔哩_bilibili

自动生成html文件

HtmlWebpackPlugin | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

之前用 webpack 打包项目的时候,需要手动把 html 拷贝到出口目录中,并且手动引入打包后的 js 文件,现在是在讲怎么自动创建一个 html 并引入。

网站里面有一个导向github的详细文件jantimon/html-webpack-plugin: Simplifies creation of HTML files to serve your webpack bundles (github.com),可以一个个看查找,配置这些东西直接去csdn搜索就行了,很详细的

针对多模块复用同一外部库的重复打包输出处理措施 输出文件的批量命名

这是webpack.config.js

javascript 复制代码
const path = require('path');
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
    //入口
    entry: path.resolve(__dirname, 'src/login/index.js'),
    //出口
    output: {
        path: path.resolve(__dirname, 'dist'),
        filename: './login/index.js',
        clean: true //生成打包后内容之前,清空输出目录
    },
    //插件(给Webpack提供更多功能)
    plugins: [
        new HtmlWebpackPlugin({
            template: path, resolve(__dirname, 'public/login.html'), // 模板文件
            filename: path.resolve(__dirname, 'dist/login/index.html') // '渝出文件
        })
    ]
};

终端npm run build,然后就报错的先用命令npm uni html-webpack-plugin --save-dev把插件删了然后重下,我刚才就碰到了EPERM错误,网上说是包没下完整

查看下文件夾的路徑是否正確

打包css

webpack默认是只识别js代码的

https://www.webpackjs.com/loaders/css-loader/#getting-started

加载器css-loader:解析css代码 npm i css-loader style-loader --save-dev

加载器style-loader:把解析后的css代码插入到DOM

步骤:

1 .准备css文件代码引入到src/login/index.js中(压缩转译处理等)

2 .下载css-loader和style-loader本地软件包

3 .配置webpack.config.js让Webpack拥有该加载器功能

4 .打包后观察效果

在index.css输入import './index.css'的npm run build这里有坑,前面一直是用的CommonJS的规范,这里导入要用require,不然报错

这里有缺失内容

优化提取css

不要和style-loader和mini-css-extract-plugin使用

https://webpack.docschina.org/plugins/mini-css-extract-plugin/#root

npm i mini-css-extract-plugin --save-dev

在webpack.config.js加这个

javascript 复制代码
const MiniCssExtractPlugin =require('mini-css-extract-plugin')

loder是从右向左 或者 从下到上依次解析 顺序别写错了

因为老师的入口文件里bootstrap引入在index之前,所以是跟引入顺序有关的

压缩优化过程

CssMinimizerWebpackPlugin | webpack 中文文档 (docschina.org)

less打包

pink在移动端讲过less基础,但是我没看

和上面一样吗,下载配置,应该是less会自动转换为同名css,然后把原来的css覆盖掉了,原本的css样式被打乱了,是因为在你下载less的时候,它把css样式覆盖了,你需要重新把css样式复制粘贴回来。

图片打包

资源模块 | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

vue都集成了大部分功能

案例用户登录

这里这个引入的axios应该是可以看作一个变量的,然后后面的一系列操作被装进引入的axios,最后导出

需要源代码包

搭建开发环境

问题:之前改代码,需重新打包才能运行查看,效率很低开发环境:

配置webpack-dev-server快速开发应用程序

作用:启动Web服务,自动检测代码变化,热更新到网页

开发环境 | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

步骤:

  1. 下载webpack-dev-server软件包

  2. 设置模式为开发模式,配置自定义命令

    javascript 复制代码
    module.exports={
        //...
        mode:'development'
    }
  3. npm run dev开发服务器,热更新

    javascript 复制代码
    "scripts":{
        "build":"webpack"
        "dev":"webpack serve --open"
    },

    Node.js与Webpack-26.Webpack搭建开发环境_哔哩哔哩_bilibili

打包模式

打包模式:告知Webpack使用相应模式的内置优化

分类:

|------|-------------|------------------|------|
| 开发模式 | development | 调试代码,实时加载,模块热替换等 | 本地开发 |
| 生产模式 | production | 压缩代码,资源优化,更轻量等 | 打包上线 |

设置:

方式1:在webpack.config.js配置文件设置mode选项

方式2:在package.json命令行设置mode参数注意:命令行设置的优先级高于配置文件中的,推荐用命令行设置

javascript 复制代码
module.exports = {
   mode: 'production'
};
javascript 复制代码
"scripts": {
    "build": "webpack --mode=production",
    "dev": "webpack serve --mode=development"
},

其实这里老师把dist目录删除掉在演示开发模式就会更清楚,理解为什么说是放在内存中。其实并没有生成dist内容

找到原因了,如果用css-minimizer-webpack-plugin插件去压缩css文件,js的压缩就会失效,可以使用terser-webpack-plugin插件去压缩js代码

模式(Mode) | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

javascript 复制代码
module: {
    rules:[
        {
            test: /\.css$/i,
            // use: ['style-loader', "css-loader"],
            use: [process.env.NODE_ENV === 'development' ? 'style-                    loader':MiniCssExtractPlugin.loader,
              "css-loader"]
        },
        {
            test: /\.less$/i,
            use:[
                // compiles Less to CSS
                MiniCssExtractPlugin.loader,
                'css-loader',
                'less-loader',
            ],
        },
        {
            test

前端注入环境变量

需求:前端项目中,开发模式下打印语句生效,生产模式下打印语句失效

问题:cross-env设置的只在Node.js环境生效,前端代码无法访问process.env.NODE_ENV

解决: 使用Webpack内置的DefinePlugin插件

DefinePlugin | webpack 中文文档 | webpack中文文档 | webpack中文网 (webpackjs.com)

懂了,你们假设把这个process:'process'看成是一个对象的键值对,如果'process'这里写的是一个变量的话这个变量是undefined的

判断是production还是development,但直接写会导致字符串被认为变量,需要JSON强制定义为字符串

javascript 复制代码
const webpack = require('webpack')
module.exports = {
    // ...
    plugins:[
    // ...
        new webpack.Defi nePlugi n({
        // key是注入到打包后的前端JS代码中作为全局变量
        // value是变量对应的值(在corss-env注入在node, js中的环境变量字符串
        'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV)
        })
    ]
)
javascript 复制代码
axios.defaults.baseURL = process.env.NODE_ENV === 'production' ? '正式上线的基地址' : '测试用的基地址'

开发环境挑错

Node.js与Webpack-30.Webpack开发环境调错_哔哩哔哩_bilibili

解析别名alias

解析别名一配置模块如何解析,创建import引入路径的别名,来确保模块引入变得更简单

例如:原来路径如图,比较长而且相对路径不安全

解决:在webpack.config.js中配置解析别名@来代表src绝对路径

javascript 复制代码
const config = {
    resolve: {
    alias: {
    '@': path.resolve(---dirname, 'src')
        }
    }
}
javascript 复制代码
import { checkPhone, checkcode } from '../src/utils/check.js
javascript 复制代码
import { checkPhone, checkcode } from '@/utils/check.js

Node.js与Webpack-31.Webpack解析别名_哔哩哔哩_bilibili

cdn使用

​​​​​​​

需求:开发模式使用本地第三方库,生产模式下使用CDN加载引入

步骤:

1 .在html中引入第三方库的CDN地址并用模板语法判断

2 .配置webpack.config.js中externals外部扩展选项(防止某些import的包被打包)

3.两种模式下打包观察效果

javascript 复制代码
<% if (htmlWebpackPlugin.options.useCdn){ %>
    <link href ="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/5.2.3/css/bootstarp.min.css"
rel="stylesheet">
<% } %>

Node.js与Webpack-32.优化-生产模式下使用CDN_哔哩哔哩_bilibili

115,116,117都不想看

bootcdn疑似投毒,谨慎使用!

相关推荐
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
Martin -Tang2 小时前
Vue 3 中,ref 和 reactive的区别
前端·javascript·vue.js
FakeOccupational3 小时前
nodejs 020: React语法规则 props和state
前端·javascript·react.js
放逐者-保持本心,方可放逐3 小时前
react 组件应用
开发语言·前端·javascript·react.js·前端框架
曹天骄4 小时前
next中服务端组件共享接口数据
前端·javascript·react.js
阮少年、5 小时前
java后台生成模拟聊天截图并返回给前端
java·开发语言·前端
郝晨妤6 小时前
鸿蒙ArkTS和TS有什么区别?
前端·javascript·typescript·鸿蒙
AvatarGiser6 小时前
《ElementPlus 与 ElementUI 差异集合》Icon 图标 More 差异说明
前端·vue.js·elementui
喝旺仔la6 小时前
vue的样式知识点
前端·javascript·vue.js
别忘了微笑_cuicui6 小时前
elementUI中2个日期组件实现开始时间、结束时间(禁用日期面板、控制开始时间不能超过结束时间的时分秒)实现方案
前端·javascript·elementui