美文网首页React.js专题站iOS工作系列码路拾遗
Webpack-dev-server结合后端服务器的热替换配置

Webpack-dev-server结合后端服务器的热替换配置

作者: Bing573 | 来源:发表于2015-04-21 22:46 被阅读81299次

    Webpack是一个模块加载器,这里所谓模块其实就是项目中用到javascript、coffeescript、css、less、jsx以及图片等等资源,Webpack采用不同的loader将这些资源加载后打包,然后输出打包后的文件,打包后的文件可以是一个或多个js文件,也可以根据需要分别打包,比如将所有css文件单独输出。下图可以比较直观的说明webpack是做什么的。

    更多信息可以参考webpack的官方网站 

    Webpack有一个很实用的功能叫做热替换(Hot-replace),尤其是结合React Hot Loader插件,开发过程中都不需要刷新浏览器,任何前端代码的更改都会实时的在浏览器中表现出来。

    首先需要安装Webpack-dev-server,一个轻量的node.js express服务器。

    npm install webpack-dev-server --save-dev

    Webpack-dev-server十分小巧,这里的作用是用来伺服资源文件,不能替代后端的服务器,因此如果你还要进行后端开发,就要采用双服务器模式:一个后端服务器和一个资源服务器(即Webpack-dev-server)

    配置双服务器热替换模式首先需要修改Wepack.config.js的entry条目

    entry: [
        'webpack-dev-server/client?http://0.0.0.0:9090',//资源服务器地址
        'webpack/hot/only-dev-server',
        './static/js/entry.coffee'
    ]

    注意,由于要结合了后端服务器,因此不采用
    entry: {
        app: ['webpack/hot/dev-server', './app/main.js']
    }

    这种形式。

    接下来修改output条目,将publicPath设置为webpack-dev-server服务器下资源目录的绝对路径

    output: {
        publicPath: "http://127.0.0.1:9090/static/dist/",
        path: './static/dist/',
        filename: "bundle.js"
    }

    在Plugins中增加

    new webpack.DefinePlugin({
        'process.env.NODE_ENV': '"development"'
    }),
    new webpack.HotModuleReplacementPlugin()

    webpack变量需要在Webpack.config.js的开始处声明

    var webpack = require('webpack');

    接着中页面文件中插入打包后的资源文件,注意这里要采用资源服务器的绝对路径

    <script src="http://127.0.0.1:9090/static/dist/bundle.js"></script>

    双服务器的原理其实就是让后端服务器伺服的页面加载资源服务伺服的资源。

    如果要实现react的热加载,还需要React Hot Loader插件

    npm install react-hot-loader --save-dev

    然后将react-hot loader放在jsx文件loader链的第一位

    { test: /\.jsx?$/, loaders: ['react-hot', 'jsx?harmony'], include: path.join(__dirname, 'src') }

    最后就是启动Webpack-dev-server服务器,注意这里要采用inline模式, 如果采用hot模式会出现错误。--content-base 为资源文件夹。另外如果你想用另一台电脑做调试,需要增加--host参数为开发服务器的IP地址,因为默认只能通过localhost进行方式。如果IP地址经常变动,可以写一个脚本方便每次启动服务器

    #!/bin/sh

    ip=`awk '/inet / && $2 != "127.0.0.1"{print $2}' <(ifconfig)`

    node webpack-dev-server.js --port 9090 --inline --host $ip --content-base static/dist/

    当资源文件修改时,webpack-dev-server将通过socket.io通知客户端更新.
    关于Webpack-dev-server的更多资料请点击这里

    相关文章

      网友评论

      • fca6d3c6a144:真的十分感谢作者,我都出个问题都研究一天了没解决,看完你的文章后ok了,再次感谢
      • 9e8a031994c1:在配置完devServer之后,连接说localhost拒绝我们的请求,端口没有被占用,就莫名其妙的,我用apach配置完是可以连接本地的,不知道为什么,楼主有遇到这种坑么? 一直拒绝请求
      • 1b96587d9bad:这样写是实现了js自动刷新,但是改动html,css没有效果
        Bing573:现在可以尝试livereload,可以参考我另一篇介绍前端自动化工具的文章
      • 46f1cccb7de5:react-hot弃用了,原作者推荐了babel插件实现react-hot加载...
        MeiganFang:@__undefined_ babel能实现热替换了?
        2f0cd7dc2cd8:@__undefined_ babel的哪个插件呀?
        Bing573:@__undefined_ 谢谢提醒

      本文标题:Webpack-dev-server结合后端服务器的热替换配置

      本文链接:https://www.haomeiwen.com/subject/zleufttx.html