webpack5搭建本地服务,dev-server和resolve配置详解

1,606 阅读3分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

搭建本地服务

之前我们都是通过webpack来对项目进行打包,然后利用vscode的live server插件,来运行我们的项目的。那么会带了一个问题,每次更新代码都要重新打包代码,为了解决这个问题,我们可以使用一下两种方法。

一、webpack watch mode;

二、webpack-dev-server(常用)

webpack watch mode

我们可以通过配置wepback为watch模式,在该模式下,webpack依赖图中的所有文件,只要有一个发生了更新,那么代码将被重新编译; 这要我们就不需要手动进行打包了。

配置方式:

方式一:在导出的配置中,添加 watch: true;

image.png 方式二:在启动webpack的命令中,添加 --watch的标识;

 "scripts": {
     "build": "webpack --watch"
   },

webpack-dev-server

安装:

 npm install webpack-dev-server -D

配置devServer:

  1. static:配置从相应目录提供静态文件,默认为public文件夹
  2. hot:配置模块热替换(Hot Module Replacement),模块热替换是指在 应用程序运行过程中,替换、添加、删除模块,而无需重新刷新整个页面;
 devServer: {
     static: {
       directory: path.join(__dirname, "aaa"),
     },
     hot: true, //启用模块热替换
     host: "localhost", //设置host
     port: 8005, //设置端口号
     open: true, //自动打开浏览器
     compress: true, //将静态资源进行gzip压缩
   },

配置了hot为true后,我们还需要指定哪些模块需要模块热替换。

 import "./js/component";
 if (module.hot) {
   module.hot.accept("./js/component.js", function () {});
 }

像上面这样配置一个一个配置需要模块热替换的模块,很麻烦,但是不必担心,在vue和react中都有成熟的库为我们解决这个问题。

vue中v-loader实际上是实现了vue组件的HMR。

resolve

resolve用于设置模块如何被解析:

  • 在开发中我们会有各种各样的模块依赖,这些模块可能来自于自己编写的代码,也可能来自第三方库;
  • resolve可以帮助webpack从每个 require/import 语句中,找到需要引入到合适的模块代码;
  • webpack 使用 enhanced-resolve 来解析文件路径;

webpack能解析三种文件路径:

绝对路径 :

  • 由于已经获得文件的绝对路径,因此不需要再做进一步解析。

相对路径 :

  • 在这种情况下,使用 import 或 require 的资源文件所处的目录,被认为是上下文目录;
  • 在 import/require 中给定的相对路径,会拼接此上下文路径,来生成模块的绝对路径;

模块路径

  • 在 resolve.modules中指定的所有目录检索模块;
  • 默认值是 ['node_modules'],所以默认会从node_modules中查找文件;
确定是文件还是文件夹

如果是文件:

  1. 有后缀名,则加载该文件
  2. 没有后缀名,使用resolve.extensions选项作为文件扩展名解析;extensions默认值为 ['.wasm', '.mjs', '.js', '.json'];

如果是文件夹:会在文件夹中根据 resolve.mainFiles配置选项中指定的文件顺序查找;

  • resolve.mainFiles的默认值是 ['index'];
  • 再根据 resolve.extensions来解析扩展名;

配置resolve:

  resolve: {
     extensions: [".wasm", ".mjs", ".js", ".json", ".vue"],//扩展名
     alias: {
       "@": path.resolve(__dirname, "./src/js"),//起别名
     },
   },

区分开发和生产环境

配置不同的webpack配置文件。然后开发和生产时使用不同的配置文件。

注意: entry的路径相对于context属性,context默认为项目根目录。

 "scripts": {
     "build": "webpack  --config ./config/webpack.pro.config.js",
     "serve": "webpack serve  --config ./config/webpack.dev.config.js"
   },

公用配置文件:webpack.com.config.js

和并配置配置文件时,使用到了webpack-merge。