You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Prepare live html pagevarlivePage=this.livePage=newStreamCache();fs.createReadStream(path.join(__dirname,"..","client","live.html")).pipe(livePage);// Prepare the live js filevarliveJs=newStreamCache();fs.createReadStream(path.join(__dirname,"..","client","live.bundle.js")).pipe(liveJs);// Prepare the inlined js filevarinlinedJs=newStreamCache();fs.createReadStream(path.join(__dirname,"..","client","index.bundle.js")).pipe(inlinedJs);
记录下
webpack-dev-server
的用法.首先,我们来看看基本的
webpack.config.js
的写法配置文件提供一个入口和一个出口,
webpack
根据这个来进行js的打包和编译
工作。虽然webpack
提供了webpack --watch
的命令来动态监听文件的改变并实时打包,输出新bundle.js
文件,这样文件多了之后打包速度会很慢,此外这样的打包的方式不能做到hot replace
,即每次webpack
编译之后,你还需要手动刷新浏览器。webpack-dev-server
其中部分功能就能克服上面的2个问题。webpack-dev-server
主要是启动了一个使用express
的Http服务器
。它的作用主要是用来伺服资源文件。此外这个Http服务器
和client
使用了websocket
通讯协议,原始文件作出改动后,webpack-dev-server
会实时的编译,但是最后的编译的文件并没有输出到目标文件夹,即上面配置的:注意:你启动webpack-dev-server后,你在目标文件夹中是看不到编译后的文件的,实时编译后的文件都保存到了内存当中。因此很多同学使用webpack-dev-server进行开发的时候都看不到编译后的文件
下面来结合
webpack
的文档和webpack-dev-server
里部分源码来说明下如何使用:##启动
启动
webpack-dev-server
有2种方式:cmd line
Node.js API
##配置
我主要讲解下
cmd line
的形式,Node.js API
形式大家去看下官方文档。可通过npm script
进行启动。我的目录结构是:###content-base
设定
webpack-dev-server
伺服的directory
。如果不进行设定的话,默认是在当前目录下。这个时候还要注意的一点就是在
webpack.config.js
文件里面,如果配置了output
的publicPath
这个字段的值的话,在index.html
文件里面也应该做出调整。因为webpack-dev-server
伺服的文件是相对publicPath
这个路径的。因此,如果你的webpack.config.js
配置成这样的:那么,在
index.html
文件当中引入的路径也发生相应的变化:如果在
webpack.config.js
里面没有配置output
的publicPath
的话,那么index.html
最后引入的文件js文件
路径应该是下面这样的。##Automatic Refresh
webpack-dev-server
支持2种自动刷新的方式:这2种模式配置的方式和访问的路径稍微有点区别,最主要的区别还是
Iframe mode
是在网页中嵌入了一个iframe
,将我们自己的应用注入到这个iframe
当中去,因此每次你修改的文件后,都是这个iframe
进行了reload
。通过查看
webpack-dev-server
的源码,lib
路径下的Server.js
文件,第38-48行,分别新建几个流,这几个流保存了client
文件夹下的相关文件:当使用
Iframe mode
时,请求/webpack-dev-server/index.html
路径时,会返回client/index.html
文件,这个文件的内容就是:这个页面会请求
live.bundle.js
,其中里面会新建一个Iframe
,你的应用就被注入到了这个Iframe
当中。同时live.bundle.js
中含有socket.io
的client
代码,这样它就能和webpack-dev-server
建立的http server
进行websocket
通讯了。并根据返回的信息完成相应的动作。而
Inline-mode
,是webpack-dev-server
会在你的webpack.config.js
的入口配置文件中再添加一个入口,这样就完成了将
inlinedJS
打包进bundle.js
里的功能,同时inlinedJS
里面也包含了socket.io
的client
代码,可以和webpack-dev-server
进行websocket
通讯。当然你也可以直接在你
index.html
引入这部分代码:不过
Iframe mode
和Inline mode
最后达到的效果都是一样的,都是监听文件的变化,然后再将编译后的文件推送到前端,完成页面的reload
的。###Iframe mode
Iframe mode
下cmd line
不需要添加其他的内容,浏览器访问的路径是:这个时候这个页面的
header部分
会出现整个reload消息
的状态。当时改变源文件的时候,即可以完成自动编译打包,页面自动刷新的功能。###Inline mode
使用
inline mode
的时候,cmd line
需要写成:这个时候访问的路径是:
也能完成自动编译打包,页面自动刷新的功能。但是没有的
header
部分的reload
消息的显示,不过在控制台中会显示reload
的状态。##Hot Module Replacement
开启
Hot Module Replacemen
t功能,在cmd line
里面添加--hot
##其他配置选项
还有一切其他的配置信息可以查阅官方文档:
webpack-dev-server-cli
这是我的
package.json
的文件:首先命令行:输入
npm install
所有依赖。然后输入npm run dev
。在浏览器中打开localhost:8080/index.html,然后就可以愉快的开发咯。##本地搭建API Server
如果你在本地还启动了一个
api server
,port
为3000,这个server
主要和你的前端应用进行数据交互。这个时候很显然会出现跨域的问题,那么这个时候,你前端应用的入口文件应当是用你自己启动的api server
提供的。此外
webpack.config.js
:将
publicPath
字段的内容配置为绝对路径。同时index.html
文件中对js
引用的路径也改为绝对路径如果对
web-dev-server
还有其他问题的话,请留言告知。另外2篇关于
webpack
的文章:webpack1.x分包及异步加载套路
webpack2分包及异步加载套路
The text was updated successfully, but these errors were encountered: