初识webpack(二)解析resolve、插件plugins、dev-server

目录

(一)webpack的解析(resolve)

1.resovle.alias

2.resolve.extensions

3.resolve.mainFiles

[(二) plugin插件](#(二) plugin插件)

1.CleanWebpackPlugin

2.HtmlWebpackPlugin

3.DefinePlugin

(三)webpack-dev-server

1.开启本地服务器

2.HMR模块热替换

3.devServer的更多配置项


(一)webpack的解析(resolve)

解析(Resolve) | webpack 中文文档 | webpack中文文档 | webpack中文网

resolve 用于配置模块如何被解析

webpack能解析的三种文件路径

  1. 绝对路径:已获得文件的绝对路径,不需要进一步解析。
  2. 相对路径:通过import/require中给的相对路径,来拼接上下文路径,生成该模块的绝对路径
  3. 模块路径:在resolve.modules配置中指定的所有目录中检索模块,默认从node_modules目录中查找模块。

确定路径是文件还是文件夹

是文件:

  • 有扩展名:直接打包
  • 没有扩展名:根据resolve.extensions配置作为文件扩展名解析

是文件夹:

在文件中根据resolve.mainFiles配置中指定的文件顺序查找

  • resolve.mainFiles配置默认文件名 index
  • 再根据resolve.extensions配置来解析扩展名

接下来只详细写一下两个配置项,比较常用

1.resovle.alias

当文件目录很复杂时,使用相对路径../../这种形式进行引用会非常不直观不方便。

给常用的路径起一个别名,来确保模块引用变得简单

例如:给/src/utils文件夹取别名

javascript 复制代码
/* 在webpack.config.js中 */
module.exports = {
    ...
    module: {
        /* resolve用于配置模块如何被解析 */
        resolve: {
            /* 为路径取别名 引入时更直观方便 */
            alias: {
                utils: path.resolve(__dirname, 'src/utils/')
            }
        }
    },
}

原来使用该模块路径引用情况:

javascript 复制代码
import A from '../../utils/a'

现在使用该模块路径:

javascript 复制代码
import A from 'utils/a'

2.resolve.extensions

webpack解析文件时不带扩展名,会自动根据resolve.extensions配置中的扩展名按照顺序进行匹配,能够使用户在引入模块时不带扩展

默认值是 ['.wasm','.mjs','.js','.json']

可自行配置需要的扩展名

javascript 复制代码
resolve: {
    /* 扩展名数组 */
    extensions:['.ts','.js','.wasm'] // 会自动覆盖默认数组
}

注意:会自动覆盖默认数组,可以使用'...'来添加默认扩展数组

javascript 复制代码
resolve: {
    /* 扩展名数组 */
    extensions:['.ts','.js','.wasm','...']
}

3.resolve.mainFiles

解析目录时要使用的文件名

javascript 复制代码
resolve: {
    mainFiles: ['index'],
  },

(二) plugin插件

plugin | webpack 中文文档 | webpack中文文档 | webpack中文网

loader:用于转换某些类型的模块

插件plugin:用于执行范围更广的任务。包括:打包优化,资源管理,注入环境变量

想要使用一个插件,你只需要 require() 它,然后把它添加到 plugins 数组中。多数插件可以通过选项(option)自定义。你也可以在一个配置文件中因为不同目的而多次使用同一个插件,这时需要通过使用 new 操作符来创建一个插件实例。

接下来详细写一些常用插件的使用方法

1.CleanWebpackPlugin

webpack打包生成文件夹后再运行打包不会将原来的文件夹全部删除,需要手动删除文件夹

该插件可以帮助我们直接删除原打包文件夹并重新生成

下载CleanWebpackPlugin插件:

npm i clean-webpack-plugin -D

在webpack.config.js文件中进行插件配置:

javascript 复制代码
// 局部引入插件
const { CleanWebpackPlugin } = require('clean-webpack-plugin')

module.exports = {
    ...
    plugins: [
        // 使用插件
        new CleanWebpackPlugin()
    ]
}

现在,webpack官网plugins中不再记录有CleanWebpackPlugin插件,可以直接在output配置中设置 clean:true 即可

Output | webpack 中文文档 | webpack中文文档 | webpack中文网

javascript 复制代码
output:{
    clean: true
}

2.HtmlWebpackPlugin

HtmlWebpackPlugin插件会在每次打包时在打包文件夹中自动生成html文件,

下载插件:

npm install --save-dev html-webpack-plugin

在webpack.config.js中进行配置:

javascript 复制代码
// 为打包文件生成html文件的插件
const HtmlWebpackPlugin = require('html-webpack-plugin')

module.exports = {
    plugins: [
        // 使用插件
        new CleanWebpackPlugin(),
        new HtmlWebpackPlugin({
            // 打包项目的标题
            title: 'dogeggWebsite',
            // html文件名 默认index.html
            filename: 'index.html',
            // 根据当下index.html文件的格式生成打包文件夹中的html 
            // 默认使用路径src/index.html的模板格式
            template: './src/index.html',
        })
    ]
}

更多该插件的配置项在官方文档中查看

3.DefinePlugin

DefinePlugin | webpack 中文文档 | webpack中文文档 | webpack中文网

DefinePlugin插件允许在编译时创建全局常量使用,不需要额外下载

使用方法:

传递给 DefinePlugin 的每个键都是一个标识符或多个以 . 连接的标识符。

  • 如果该值为字符串,它将被作为代码片段来使用。
  • 如果该值不是字符串,则将被转换成字符串(包括函数方法)。
  • 如果值是一个对象,则它所有的键将使用相同方法定义。
  • 如果键添加 typeof 作为前缀,它会被定义为 typeof 调用。

在webpack.config.js中配置:

javascript 复制代码
// 引入definePlugin
const { DefinePlugin } = require('webpack')

module.exports = {
    ...
    plugins: [
        new DefinePlugin({
            // 传入参数是键值对形式,引号内是js代码形式
            // 'BASE_URL': '"./"',
            BASE_URL: JSON.stringify("./")
        })
    ]
}

在src/index.html中使用该常量:

javascript 复制代码
 <link rel="icon" href="<%= BASE_URL %> favicon.ico" type="image/x-icon">

打包到文件夹后效果:

javascript 复制代码
<link rel="icon" href="./ favicon.ico" type="image/x-icon">

(三)webpack-dev-server

在开发模式中,希望对代码做出改动能够立即编译并展示,就像liveServer一样

因此,使用webpack的开发工具来完成这一效果

webpack 提供几种可选方式,帮助你在代码发生变化后自动编译代码:

  1. webpack 的 Watch Mode(观察模式)
  2. webpack-dev-server
  3. webpack-dev-middleware

下面使用webpack-dev-server来搭建本地服务器

1.开启本地服务器

webpack-dev-server 提供了一个基本的 web server,并具有实时重新加载的功能

下载:npm i webpack-dev-server -D

在package.json里配置serve的便捷指令

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

在webpack.config.js中对devServer配置项进行自定义的配置

javascript 复制代码
devServer: {

}

在终端开启服务器:npm run serve

默认在端口8080开启

2.HMR模块热替换

HMR 全称 Hot Module Replacement,翻译为模块热替换

模块热替换是指,在应用程序运行过程中,替换、修改、删除模块,而无需刷新整个页面

webpack-dev-server默认开启HMR

但还是会出现更改一个模块整个页面都刷新的情况:这就需要在入口文件main.js中对需要热替换的模块进行设置

javascript 复制代码
/* 在入口文件中 */

// 如果HMR开启,就对对应模块进行热更新,并执行回调函数
if (module.hot) {
    module.hot.accept('./utils/a.js', () => {
        console.log('a模块已更新');
    })
}

再对a模块的内容进行修改就会发现,只更新了a模块内容

3.devServer的更多配置项

DevServer | webpack 中文文档 | webpack中文文档 | webpack中文网

这个不详细写了,需要用到的时候查阅就可以了

相关推荐
拾光拾趣录4 分钟前
CSS 深入解析:提升网页样式技巧与常见问题解决方案
前端·css
莫空00005 分钟前
深入理解JavaScript属性描述符:从数据属性到存取器属性
前端·面试
guojl6 分钟前
深度剖析Kafka读写机制
前端
FogLetter7 分钟前
图片懒加载:让网页飞起来的魔法技巧 ✨
前端·javascript·css
Mxuan7 分钟前
vscode webview 插件开发(精装篇)
前端
Mxuan8 分钟前
vscode webview 插件开发(交付篇)
前端
Mxuan9 分钟前
vscode 插件与 electron 应用跳转网页进行登录的实践
前端
拾光拾趣录10 分钟前
JavaScript 加载对浏览器渲染的影响
前端·javascript·浏览器
Codebee10 分钟前
OneCode图表配置速查手册
大数据·前端·数据可视化
然我10 分钟前
React 开发通关指南:用 HTML 的思维写 JS🚀🚀
前端·react.js·html