Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【webpack】webpack-dev-server生猛上手——让我们来搭一个webpack的微服务器吧!

【webpack】webpack-dev-server生猛上手——让我们来搭一个webpack的微服务器吧!

作者头像
啦啦啦321
发布于 2018-01-03 07:26:46
发布于 2018-01-03 07:26:46
2.6K00
代码可运行
举报
运行总次数:0
代码可运行

[前言]:因为最近在搞****API的时候用到了webpack的externals,才发现我之前都只是用webpack做一些搭建完项目后的“收尾工作”——即打包,而没有把它纳入到项目开发的“主体过程”中来,真是“物不尽其用”。于是就有了我今天的这篇学习文章:利用webpack-dev-server搭建一个webpack的服务器

参考资料:

webpack-dev-server的github地址:https://github.com/webpack/webpack-dev-server

webpack1官方文档http://webpack.github.io/docs/webpack-dev-server.html(推荐看2的文档)

webpack2官方文档https://webpack.js.org/configuration/dev-server/#devserver(推荐读这个)

 提纲:

1.复习webpack的知识

2.详解webpack-dev-server的配置属性

3.webpack-dev-server的自动刷新和模块热替换机制

4.webpack下配置服务器的三种方式

 复习一下webpack的知识

我将目录结构简化之后长这样:

我的webpack.config.js:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var webpack = require('webpack')
var path =require('path')
module.exports = {
entry:{
   app:path.join(__dirname,'src','index.js')
},
output:{
   filename:'bundle.js',
   path:path.join(__dirname,'dist')
  }
}

我的src/index.js:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
require('./a.js')
require('./b.js')
console.log('我是index.js')

我的src/a.js:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log('我是a.js')

我的src/b.js:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log('我是b.js')

我的dist/index.html:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*其他部分省略*/
<body>
  <script src="./bundle.js"></script>
</body>

当我们在终端运行“webpack”命令后,目录变为:

一张图复习一下webpack的机制:

OK,下面,让我们开始搭建一个服务器吧:

怎么用最简单的方式搭建一个服务器?

1.你需要一个安装一个模块

在终端中进入项目目录下,敲下npm install webpack-dev-server --save-dev回车

2.在终端运行一段命令:

node_modules/.bin/webpack-dev-server(网上有的说直接输webpack-dev-server那是错的)

成功!输出的是这一段信息:

然后进入默认的localhost:8080页面:

服务器的根目录就是我们工程的目录

到这里,我们要做的第一步就成功啦!

进入dist后,我们发现报了这样一段错误:

what?没有找到bundle.js?

所以我们要在webpack.config.js里写一下配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
/*这里省略entry和output,参照上面写的内容*/
  devServer: {
       contentBase: path.join(__dirname, "dist")
   }
}

保存,后打开页面看控制台,报错已经消失了!正确打印了被打包的文件内容:

详解webpack-dev-server的配置属性 

1.devServer.contentBase

contentBase是我们今天要讲的第一个webpack-dev-server的配置属性,那么,contentBase做了什么事情呢?——它指定了服务器资源的根目录,如果不写入contentBase的值,那么contentBase默认是项目的目录。

在上面例子中产生错误和后来解决错误的原因:

产生错误:因为bundle.js被"放在了"我们的项目根目录里,在dist/html里<script src="./bundle.js"></script>此时显然不能根据路径找到bundle.js

解决错误:通过配置contentBase: path.join(__dirname, "dist")将bundle.js"放在了"dist目录下,此时bundle.js和dist/index.html位于同一目录下,通过 src="./bundle.js"自然就找到bundle.js了

webpack打包和webpack-dev-server开启服务的区别——

webpack输出真实的文件,而webpack-dev-server输出的文件只存在于内存中,不输出真实的文件!(注意下面两张图的区别)

webpack:当我们在终端运行"webpack"后:

webpack-dev-server:当我们在终端运行"node_modules/.bin/webpack-dev-server后:

这也就是我在上面的阐述中将bundle.js"放在了"加上双引号的原因

2.devServer.port

port配置属性指定了开启服务的端口号:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
devServer: {
   port:7000
}

设置端口号为7000:

运行:node_modules/.bin/webpack-dev-server

这个时候就不是默认的8080的端口了,而是我们设置的7000

3.devServer.host

host设置的是服务器的主机号:

修改配置为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
devServer: {
   contentBase: path.join(__dirname, "dist"),
   port:7000,
   host:'0.0.0.0'
}

此时localhost:7000和0.0.0.0:7000都能访问成功

4.devServer.historyApiFallback

在文档里面说的很清楚,这个配置属性是用来应对返回404页面时定向到特定页面用的(the index.html page will likely have to be served in place of any 404 responses)

在dist目录下新增一个HTML页面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/*剩下的都是很常规的HTML内容,故省略*/
<p>这里是404界面</p>

我们把webpack.config.js修改如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
/*这里省略entry和output,参照上面写的内容*/
devServer: {
contentBase: path.join(__dirname, "dist"),
historyApiFallback:{
   rewrites:[
      {from:/./,to:'/404.html'}
   ]
  }
 }
}

打开页面,输入一个不存在的路由地址:

5.devServer.overlay

这个配置属性用来在编译出错的时候,在浏览器页面上显示错误,默认是false,可设置为true

首先我们人为制造一个编译错误:在我们尚未配置babel loader的项目里使用ES6写法:

在src/index.js里写入“const a”

在shell里提示编译错误:

但在浏览器里没有提示:

所以我们把webpack.config.js修改为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
module.exports = {
     /*这里省略entry和output,参照上面写的内容*/
   devServer: {
       contentBase: path.join(__dirname, "dist"),
       overlay: true
   }
}

再重新运行node_modules/.bin/webpack-dev-server,浏览器上把错误显示出来了

6.devServer.stats(字符串)

这个配置属性用来控制编译的时候shell上的输出内容,我们没有设置devServer.stats时候编译输出是这样子的:

(其中看起来有许多看似不重要的文件也被打印出来了)

stats: "errors-only"表示只打印错误:

我们把配置改成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
devServer: {
   contentBase: path.join(__dirname, "dist"),
   stats: "errors-only"
}

因为只有错误才被打印,所以,大多数信息都略过了

除此之外还有"minimal","normal","verbose",这里不多加赘述

7.devServer.quiet

当这个配置属性和devServer.stats属于同一类型的配置属性

当它被设置为true的时候,控制台只输出第一次编译的信息,当你保存后再次编译的时候不会输出任何内容,包括错误和警告

来做个对比吧:

quiet:false(默认):

第一次编译:

第二次编译(当你保存的时候)

quiet:true

第一次编译同上

第二次编译什么都不输出

【吐槽】这样看的话感觉这个配置好像只有负面作用呢.....

8.devServer.compress

这是一个布尔型的值,当它被设置为true的时候对所有的服务器资源采用gzip压缩

采用gzip压缩的优点和缺点:

优点:对JS,CSS资源的压缩率很高,可以极大得提高文件传输的速率,从而提升web性能

缺点:服务端要对文件进行压缩,而客户端要进行解压,增加了两边的负载

9.devServer.hot和devServer.inline

在这之前,首先要说一下的是webpack-dev-server的自动刷新和模块热替换机制

webpack-dev-server的自动刷新和模块热替换机制

这两个机制是紧紧联系在一起的

从外部角度看——自动刷新

当我们对业务代码做了一些修改然后保存后(command+s),页面会自动刷新,我们所做的修改会直接同步到页面上,而不需要我们刷新页面,或重新开启服务

(The webpack-dev-server supports multiple modes to automatically refresh the page)

从内部角度看——模块热替换

在热替换(HMR)机制里,不是重载整个页面,HMR程序会只加载被更新的那一部分模块,然后将其注入到运行中的APP中

(In Hot Module Replacement, the bundle is notified that a change happened. Rather than a full page reload, a Hot Module Replacement runtime could then load the updated modules and inject them into a running app.)

webpack-dev-server有两种模式可以实现自动刷新和模块热替换机制

1. Iframe mode(默认,无需配置)

页面被嵌入在一个iframe里面,并且在模块变化的时候重载页面

2.inline mode(需配置)添加到bundle.js中

当刷新页面的时候,一个小型的客户端被添加到webpack.config.js的入口文件中

例如在我们的例子中,在使用inline mode的热替换后,相当于入口文件从

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
entry:{
    app:path.join(__dirname,'src','index.js')
}

变成了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
entry:{
    app:[path.join(__dirname,'src','index.js'),
             'webpack-dev-server/client?http://localhost:8080/'
          ]
}

从一个入口变成了两个入口,并实现刷新

那怎么才能inline mode模式的刷新呢?

你需要做这些:

1在配置中写入devServer.hot:true和devServer.inline:true

2增加一个插件配置webpack.HotModuleReplacementPlugin()

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var webpack = require('webpack')
module.exports = {
   /*省略entry ,output等内容*/
   plugins:[
        new webpack.HotModuleReplacementPlugin()
    ],
   devServer: {
        inline:true,
        hot:true
    }
}

打开页面:

如果有上面两行输出则表明你已经配置成功

现在还有一个问题,那就是每次直接输入node_modules/.bin/webpack-dev-server来启动服务器对我们来说简直就是莫大的痛苦,那么怎么对这一过程进行简化呢?

答案:把这个运行脚本写到package.json里就行了!

这里我把我的package.json写成:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
   "name": "webpackTest2",
   "dependencies": {},
   "devDependencies": {},
   "scripts": {
       "start": "node_modules/.bin/webpack-dev-server"
     }
}

在终端运行npm start:

运行成功!

配置服务的三种方式

1在webpack.config.js输出对象中的devServer属性中写配置(也就是我们上述所有例子的做法)

2写在package.json中,写在node 命令对应的脚本中,例如我们可以写成:

"scripts": {

"start": "node_modules/.bin/webpack-dev-server --port 8000 --inline true "

}

(但这显然并不是一个值得推荐的方式)

3使用纯node的API实现,下面是一个官方给的例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var config = require("./webpack.config.js");
config.entry.app.unshift("webpack-dev-server/client?http://localhost:8080/");
var compiler = webpack(config);
var server = new WebpackDevServer(compiler, {
       /*我们写入配置的地方*/
});
server.listen(8080);
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-06-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Webpack(三):使用 plugin 以及本地服务器搭建
webpack 自带 BannerPlugin,我们只需要在 webpack.config.js 中配置即可:
Chor
2019/11/07
1.1K0
webpack4实用配置指南-上手篇
算起来已经有3到4个项目的webpack构建打包经历。然而每次搭建起来还是有新手既视感,比较捉急。工具用法的东西,好记性不如烂笔头,有必要系统梳理下webpack的配置常用配置以及构建优化。
elson
2018/06/19
4.8K0
【One by one系列】一步步学习webpack打包
0配置,webpack4受Parcel打包工具启发,尽可能的让开发者运行项目的成本变低。webpack4不再强制需要webpack.config.js作为打包的入口配置文件,默认的入口为./src/和默认的出口./dist,小项目的福音。
DDGarfield
2022/06/23
4220
入门webpack的最佳实践(基于webpack4.X 5.X)--基础篇
来到这家公司之后,一直在使用webpack,也写了不少笔记,但是都比较零散,现在决定整理一下webpack相关的知识点,由浅入深,方便自己后续查漏补缺,后续会一直更新。
Jou
2022/08/18
6730
入门webpack的最佳实践(基于webpack4.X 5.X)--基础篇
webpack超详细教程!入门一篇就够了
webpack 是前端的一个项目构建工具,它是基于 Node.js 开发出来的一个前端工具;
beifengtz
2019/08/26
9.9K0
webpack超详细教程!入门一篇就够了
Webpack系列——关于Webpack-dev-server配置的点点滴滴
我们都知道webpack-dev-server为我们在开发的时候提供了一个服务器以便于我们的开发,我们在使用之前当然需要安装:
用户1515472
2019/07/24
9560
webpack快速构建项目
webpack是什么我在这里就不多说了,实在不知道的可以直接在去搜一下,都一大堆答案。关于用webpack怎么构建项目,方法也是多种多样,五花八门。今天,我就写下我平常构建项目的方式,这个方式我觉得比较便捷和简单粗暴,如果有什么要指出的,也欢迎大家评论,毕竟我也只是一个前端新人。
守候i
2018/08/22
8500
webpack快速构建项目
webpack——快速入门【一】
https://github.com/webproblem/learning-article#webpack
思索
2024/08/16
1540
webpack——快速入门【一】
Webpack系列——快速入门
多文件入口 对entry采用对象写法,指定对应的键值对,为了输出这多个文件可以使用占位符
用户1515472
2019/07/24
6750
WebPack 模块化打包工具(上)
本篇博文的内容根据 入门 Webpack,看这篇就够了 该篇文章总结而来,其代码、模块示例、功能拓展部分均有所删减,若是想了解更多关于 WebPack 的详细内容,敬请参考原文
Nian糕
2018/08/21
5550
WebPack 模块化打包工具(上)
使用 webpack 4 和 Babel 7 构建 React 应用及如何引入 Material Design
在过去的一年和一些人中,我一直在与 Creative Tim 合作。 我一直在使用 create-react-app 来开发一些不错的产品。 有很多客户询问如何在 Webpack 上迁移我们的产品模板。
前端小智@大迁世界
2019/03/15
9.6K0
使用 webpack 4 和 Babel 7 构建 React 应用及如何引入 Material Design
Webpack 使用详解
Webpack 是一个现代 JavaScript 应用程序的静态模块打包器。本文将详细介绍如何使用 Webpack,以及提供代码示例。为了保持篇幅,我们将简要介绍 Webpack 的核心概念和功能。
世间万物皆对象
2024/03/20
1580
使用Webpack来做自己的cra脚手架
现如今的JavaScript已经出了ES6,ES7甚至许多更高的版本,但是有很多浏览器是不支持这些新的语法,所以需要通过Babel 来将你的新语法编译成浏览器可以理解的旧语法。这是通过 Babel/core模块和babel/perset-env插件完成的。当然Babel还有其他的转换功能。
学前端
2020/06/11
9480
使用Webpack来做自己的cra脚手架
Webpack基本使用
Webpack介绍:主要用于web项目中打包资源进行自动构建,Webpack将所有资源视为JS的模块来进行构建,所以对于CSS,Image等非JS类型的文件,Webpack会使用相应的加载(loader)器来加载成其可识别的JS模块资源,通过配置一些信息,就能将资源进行打包构建,更好地实现前端的工程化 Webpack安装 本地安装: npm install -D webpack -D 实际上是简写 --dev-save 如果你使用Webpack 4+ 版本, 你还需要安装CLI. npm ins
一个淡定的打工菜鸟
2018/09/06
4660
Webpack基本使用
Webpack 开发工具与模块热替换
静默虚空
2018/01/05
1.2K0
webpack5 devServer浏览器打开显示 can not get
webpack5中通过使用 webpack-dev-server 插件,配置 devServer 来浏览器启动页面,对于单页面,我们可以直接配置打开首页,多页面,可以配置打开一个文件目录,选择各个页面的目录
蓓蕾心晴
2023/08/09
3930
从零开始学VUE之Webpack(搭建本地服务器并分离开发和生产配置)
dev对应的就是我们服务启动的命令,配置完成后我们就可以通过npm run dev来启动了
彼岸舞
2021/06/07
2.5K0
从零开始学VUE之Webpack(搭建本地服务器并分离开发和生产配置)
Webpack学习总结
WebPack : 模块化解决方案(模块打包机),能够分析项目结构,找到JavaScript模块及浏览器不能直接运行的拓展语言(Scss,TypeScript等),转换和打包为合适的格式供浏览器使用。WebPack把项目当做一个整体,通过一个给定的主文件(如:index.js)开始找到项目的所有依赖文件,使用loaders处理,最后打包为一个(或多个)浏览器可识别的JavaScript文件
csxiaoyao
2018/05/11
2.7K0
webpack 入门教程
本质上,webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle。
老马
2018/08/20
4.1K0
webpack 入门教程
正确的Webpack配置姿势,快速启动各式框架!
在去年的这个时候,本骚年还在被Grunt和Gulp以及各种Requirejs、Seajs团团围住攻击,狼狈不堪。后面认识了Webpack之后,基本所有项目框架都拿它来构建了。
腾讯NEXT学位
2019/02/15
1.7K0
相关推荐
Webpack(三):使用 plugin 以及本地服务器搭建
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验