Webpack入门,项目工程配置说明

使用npm scripts

在《Webpack入门,打包第一个工程》文章讲到,webpack打包工程命令为 npx webpack --entry=./index.js --mode=development。如果每次打包时都要输入这样的命令,不仅耗时,而且容易出错。

为了使命令行指令更简洁,可以在package.json中添加一个脚本命令。

编辑工程中的package.json文件

......
"scripts": {
    "build":"Webpack --entry=./index.js --mode=development"
},
......

scripts使npm提供的脚本命令功能,在这里开发者可以直接使用由模块添加的指令(比如用webpack取代之前的npx webpack)。

为了验证打包结果,可以对addContent.js的内容稍加修改

// addContent.js
export default function() {
    document.write("use npm scripts!");
}

重新打包,这次命令输入npm run build即可。

用浏览器打开index.html,会看到页面展示“use npm scripts!”。

使用默认目录配置

在之前的工程中,index.js是放在工程根目录下,而通常情况下我们会分别设置源码目录与资源输出目录。通常情况下,工程源代码放在/src中,输出资源放在/dist中,而这些在Webpack中都是默认的配置,所以,如果没有特别的要求,在使用打包命令时,我们可以省略entry与output的配置。

建议

虽然目录命名并不是强制的,且Webpack提供了配置项让我们进行更改,但是还是建议遵循统一的命名规范,这样会使得大体结构比较清晰,也利于多人协作。

使用配置文件

为了满足不同应用场景的需求,Webpack拥有非常多的配置项以及相对应的命令行参数。开发者可以通过Webpack的帮助命令来进行查看。npx webpack -h

注意

由于Webpack使用的本地安装模式,需在工程根目录中,打开命令行,然后运行npx webpack -h命令

Webpack入门,项目工程配置说明

配置Webpack打包命令时,可以在package.json中使用npm scripts配置脚本命令。当项目需要越来越多的配置时,就要往命令中添加更多的参数,那么到后期维护起来就会相当困难。为了解决这个问题可以把这些参数改为对象的形式专门放在一个配置文件里,在Webpack每次打包时读取该配置文件即可。

Webpack的默认配置文件为webpack.config.js(也可以使用其他文件名,需要使用命令行参数指定)。

在工程根目录下新建webpack.config.js,并添加如下代码

// webpack.config.js
module.exports = {
    entry: './src/index.js',
    output: {
        filename: 'main.js',
},
    mode: 'development',
}

在配置文件中通过module.exports导出一个对象,也就是打包时被Webpack接受的配置对象。先前在命令行中输入的一大串参数就都要改为key-value的形式放在这个对象中。

现在就可以去掉package.json中配置的打包参数了。

......
"scripts": {
    "build": "webpack"
}
......

为了验证最终稿效果,对addContent.js的内容稍加修改

export default function() {
    document.write("use webpack config build!");
}

执行npm run build命令,Webpack就会预先读取webpack.config.js,然后打包。完成之后打开index.html进行验证。

使用webpack-dev-server

到这里,Webpack的初始环境已经配置好了。以往只要编辑项目源文件(JS、CSS、HTML等),刷新页面即可看到效果,现在多了一步打包,即在改完项目源码后执行npm run build更新main.js,然后才能刷新页面生效,开发调试的效率并不高。针对这种场景,Webpack社区已经为开发者提供了一个敏捷的本地开发工具——webpack-dev-server。

使用webpack-dev-server需要通过命令进行安装npm install webpack-dev-server -D

提示

安装指令中的-D参数是将webpack-dev-server作为工程的devDependencies(开发环境依赖)记录在package.json中。这样做是因为webpack-dev-server仅仅在本地开发时才会用到,在生产环境中并不需要它,所以在devDependencies中比较恰当。

为了便捷地启动webpack-dev-server,在package.json中添加一个dev指令

......
"scripts": {
    "build": "webpack",
    "dev": "webpack-dev-server"
}
......

最后,还需要对webpack-dev-server进行配置。编辑webpack.config.js

const path = require("path");
module.exports = {
    entry: "./src/index.js",
    output: {
        filename: "main.js",
    },
    mode: "development",
    devServer: {
        // 静态资源目录,如果加上这项配置,需要在工程根目录下创建public目录,并将index.html文件移到此目录中
        static: {
            directory: path.join(__dirname, "public"),
        },
        // 启用压缩
        compress: true,
        // 热更新
        hot: true,
        // 端口
        port: 3000,
        // 自动打开浏览器
        open: true,
    },
};

提示

在webpack.config.js中,通过调用Node.js的路径拼装函数patn.join(),将_dirname(Node.js内置全局变量,值为当前文件所在的绝对路径)与public(静态资源目录)连接起来,得到了最终的静态资源目录。

最后,在启动服务之前,修改以下addContent.js文件

export default function () {
    document.write("use webpack-dev-server!");
}

执行npm run dev命令,浏览器会自动打开,看到最终的效果。

webpack-dev-server工作原理

webpack-dev-server可以看作一个服务者,它的主要工作就是接收浏览器的请求,饭后将资源返回。当服务启动时,它会先让Webpack进行模块打包并将资源准备好(在本工程中就是main.js)。当webpack-dev-server接收到浏览器的资源请求时,它会首先进行URL地址校验。如果该地址是资源服务地址(上面配置的static),webpack-dev-server就会从Webpack的打包结果中寻找该资源并返回给浏览器。反之,如果请求的地址不属于资源服务地址,则直接读取硬盘中的源文件并将其返回。

提示

直接用Webpack开发和使用webpack-dev-server有一个很大的区别,前者每次都会生成main.js文件,而webpack-dev-server只是将打包结果放在内存中,并不会写入实际的main.js,在每次webpack-dev-server接收到请求时都只是将内存中的打包结果返回给浏览器。这一点可以通过删除工程中dist目录来验证。会发现,即便项目工程中没有main,js文件,刷新页面后,功能仍然是正常的。

源码仓库

https://gitee.com/zero_79152105/webpack-vblog

原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/webpack-config.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
ZEROZERO
上一篇 2022年11月8日
下一篇 2022年11月10日

相关推荐

  • Webpack入门,模块打包之ES6 Module

    JavaScript之父Brendan Eich在最初设计这门语言时,并没有包含模块的概念。基于越来越多的工程需要,为了使用模块化进行开发,JavaScript社区涌现出了多种模块…

    2022年11月11日
    711
  • Java自学之多线程编程

    多线程编程是Java语言最为重要的特性之一。利用多线程技术可以提升单位时间内的程序处理性能,也是现代程序开发中高并发的主要设计模式。 进程与线程 进程是一个应用程序。线程是一个进程…

    2020年12月16日
    1.7K
  • JavaScript 的 this 原理

    有时候会使用一种东西,并不代表你了解它。就像你会写JavaScript代码,能看懂JavaScript代码,但不代表你懂它。 学懂 JavaScript 语言,一个标志就是理解下面…

    2019年8月1日
    1.9K
  • Webpack入门,资源处理流程

    在前几篇的文章中,梳理了Webpack的模块打包功能。可以把Webpack打包模块理解成类似于工厂中的产品组装,也就是把一个个零部件拼起来得到最终的成品。接下来的几篇,则主要要关注…

    2022年11月18日
    861
  • css晦涩难懂的点都在这啦

    CSS大家肯定都是会的但是每个人所撑握的情况都不一样,特别是已经工作几年的前辈(这里指的是我司)很多CSS玩法都不知道,可能他们已经习惯了用组件, 但是面试的时候又不可避免问,所以…

    2021年1月20日
    1.5K
  • servlet学习之获取表单数据(IDEA2020.2篇)

    首先,创建一个servlet工程。 如果你不会用IDEA2020.2创建servlet工程,请打开下面链接浏览网站博文。 https://www.edu24.cn/course/j…

    2020年9月8日
    1.7K
  • JavaScript基础知识八问

    JavaScript是前端开发中非常重要的一门语言,浏览器是他主要运行的地方。JavaScript是一个非常有意思的语言,但是他有很多一些概念,大家经常都会忽略。比如说,原型,闭包…

    2020年12月30日
    1.1K
  • 5分钟带你入门vuex(vue状态管理)

    如果你之前使用过vue.js,你一定知道在vue中各个组件之间传值的痛苦,在vue中我们可以使用vuex来保存我们需要管理的状态值,值一旦被修改,所有引用该值的地方就会自动更新,那…

    2019年11月5日
    2.2K
  • windows 11 如何安装Docker Desktop

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化…

    2022年10月27日
    634
  • CSS让内容居中的方法总结

    内容水平居中  分行内元素与块级元素两种情况;其中块级元素又分定宽与不定宽两种情况; 行内元素 首先看它的父元素是不是块级元素,如果是,则直接给父元素设置 te…

    2019年6月28日
    3.6K