webpack-dev-server细微见解

537 阅读4分钟

webpack-dev-server

我们知道一个webpack构建最起码需要一个入口和一个出口,随即便可以得到一个bundle文件,我们根据这个来对js进行打包和编译。虽然webpack --watch的功能也提供了动态监测来监听文件的改变实时打包,但是其实打包的速度还是依旧缓慢的。每次更新完成后还需要手动的刷新浏览器。webpack-dev-serve的出现便是使得我们在开发的过程中更加的方便,迅速的,能够在文件变化的同时,迅速做到更新。

tip: webpack-dev-server主要是启动了一个express的服务器,提供静态资源,服务器与客户端之间使用了ws通信,文件改动后就会主动通知客户端。webpack-dev-server的文件都是输出至内存而非原始目录的。

以下是主webpack-dev-server的要属性(在webpack.config.js的devSerVer对象)

1. contentBase

它指定了服务器资源的根目录,如果不写入该值,则默认输出为根目录。并且默认打开根目录下的index.html文件(如果有的话),没有则会显示出一个资源界面。 我们一般会使用html-webpack-plugin的插件动态生成,这样的话我们需要将contentBase指向到dist目录下才行。其他的用处还未完善

2. port/host

定义打开的端口号与主机号

3. historyApiFallback

应对返回404页面时定向到特定页面用的 我们在dist目录下新增一个404的html页面 我们看看如何配置,这样也可以解决vue的history模式下无法重定向回去的问题

devServer: {
    contentBase: path.join(__dirname, "dist"),
        historyApiFallback:{
            rewrites:[
                {from:/./,to:'/404.html'}
            ]
        }
    }
}

4. overlay

在整个页面上显示编译时产生的错误信息(如果有的话),熟悉vuecli的应该非常常见的一种情况,个人感觉没什么用(一般还是在编译器内看错误),当然默认也是关闭的。

devServer: {
    // 即可开启
    overlay: true
}

5. stats

这个配置属性用来控制编译的时候shell上的输出内容。 一般来说我们将会在页面上看到很多信息,包括每个文件的构建成功,我们不需要去知道。 我们只需要去知道有没有报错就可以了。 当然还有很多其他的选项,不多赘述。

devServer: {
   stats: "errors-only"
}

6. quiet

这个基本没什么用,也是控制控制台信息展示的,第一次编译展示没什么不一样,第二次编译就会变成极简编译的样子。

7. compress

true时会采用gzip压缩资源。

8. hot/inline

我们在写代码的时候,如果文件发生了改变,页面都会自动刚刷新,我们做的修改会呈现到页面上(之前有提到的。) hot和inline应该是要共同去作用才会有所效果。 在热替换(HMR)里,则不是之前那样的原始刷新,而是根据加载的模块,进行更为细致的更新,只会去更新变化了的那部分。

webpack-dev-serve有两种方式可以实现自动刷新和HMR。

  • iframe模式(旧版本默认,新版本好像已经移除) 没什么特殊的,将html页面嵌入iframe内,并在模块变化的时候重载页面
  • inline模式
devServer: {
   inline: true,
   hot: true
}
// 开启之后,dev-server会在entry内做修改。
// 新增加了一个入口文件。
entry:{
    app:[
        path.join(__dirname,'src','index.js'),
        'webpack-dev-server/client?http://localhost:8080/'
        ]
}

// 当然不仅于此,还需要增加一个插件HotModuleReplacementPlugin

其他选项。。。

聊一聊inline与iframe模式下的区别

我们知道,webpack-dev-server开启服务后,会与客户端建立好连接。 那么我们在启动客户端的时候,仅仅是只打开了index.html吗?不是的,仅仅是打开index.html不会有那么多有用的功能。比如socket连接的库,就不可能存在。所以在webpack-dev-server开启服务后,很明显,他会将一个特殊的js注入到index.html内,使其能够连接上ws与服务端通信,所以这就有了两种注入js的方式--iframe,--inline。

--iframe就简单了,就是在外层的文件下,特殊js作用,这个特殊js完成与服务端通信,开启iframe,刷新iframe等等的活动。那么我们的应用文件就是注入到了iframe内的。

本质上是加载了live.bundle.js文件,其不但创建了iframe标签,同时包含socket.io的client代码,以和webpack-dev-server进行websocket通讯,从而完成自动编译打包、页面自动刷新的功能。

--inline又是另外一种实现方式了,他通过入口数组的方式,直接将这个特殊的js文件混入我们开发的js文件内,上述的功能,包括开启ws,刷新等等。

网上教程大多是旧版本的,新版本怎么实现细节未知,等未来开发需要使用的时候再来完善。看样子好像已经去除了ifranme模式了。可以去http://localhost:8080/webpack-dev-server.js查询其自动生成的代码。