learn-webpack4(十一)


开发模式&&webpack-dev-server

开发模式

默认情况下,不指定 mode,打包的时候就默认为 production,开发模式就是我们指定 mode 为 development.开启调试就是 devtool 设置为 source-map,非开发模式关闭此选项以减少体积
在开发模式下,还需要热重载、路由重定向、挂代理等功能,webpack4 已经提供了 devServer 选项,启动一个本地服务器,让开发者使用这些功能。

安装

 "scripts": {
    "dev": "webpack-dev-server --open"
  },
  "devDependencies": {
    "clean-webpack-plugin": "^0.1.19",
    "html-webpack-plugin": "^3.2.0",
    "jquery": "^3.3.1",
    "webpack": "^4.16.1",
    "webpack-cli": "^3.1.0",
    "webpack-dev-server": "^3.1.4"
  }

安装完之后,运行 npm run dev 就可以启动开发模式,开发模式打包的内容暂时储存在内存中

wbepack 配置

const webpack = require("webpack");
const HtmlWebpackPlugin = require("html-webpack-plugin");

const path = require("path");

module.exports = {
  entry: {
    app: "./app.js"
  },
  output: {
    publicPath: "/",
    path: path.resolve(__dirname, "dist"),
    filename: "[name]-[hash:5].bundle.js",
    chunkFilename: "[name]-[hash:5].chunk.js"
  },
  mode: "development", // 开发模式
  devtool: "source-map", // 开启调试
  devServer: {
    contentBase: path.join(__dirname, "dist"),
    port: 8000, // 本地服务器端口号
    hot: true, // 热重载
    overlay: true, // 如果代码出错,会在浏览器页面弹出“浮动层”。类似于 vue-cli 等脚手架
    proxy: {
      // 跨域代理转发
      "/comments": {
        target: "https://m.weibo.cn",
        changeOrigin: true,
        logLevel: "debug",
        headers: {
          Cookie: ""
        }
      }
    },
    historyApiFallback: {
      // HTML5 history模式
      rewrites: [{ from: /.*/, to: "/index.html" }]
    }
  },
  plugins: [
    new HtmlWebpackPlugin({
      filename: "index.html",
      template: "./index.html",
      chunks: ["app"]
    }),
    new webpack.HotModuleReplacementPlugin(),
    new webpack.NamedModulesPlugin(),
    new webpack.ProvidePlugin({
      $: "jquery"
    })
  ]
};

模块热更新

模块热更新需要 HotModuleReplacementPlugin 和 NamedModulesPlugin 这两个插件,并且顺序不能错。并且指定 devServer.hot 为 true。

if (module.hot) {
  // 检测是否有模块热更新
  module.hot.accept("./vendor/sum.js", function() {
    // 针对被更新的模块, 进行进一步操作
    console.log("/vendor/sum.js is changed");
  });
}

跨域代理

通过 devServer.proxy 做一个代理转发,来绕过浏览器的跨域限制。
按照前面的配置文件,如果想调用微博的一个接口:https://m.weibo.cn/comments/hotflow。只需要在代码中对/comments/hotflow进行请求即可:

$.get(
  "/comments/hotflow",
  {
    id: "4263554020904293",
    mid: "4263554020904293",
    max_id_type: "0"
  },
  function(data) {
    console.log(data);
  }
);

history 模式

在 vuejs 官方的脚手架 vue-cli 中,开发模式下配置如下:

historyApiFallback: {
  rewrites: [{ from: /.*/, to: "/index.html" }];
}

入口文件

import sum from "./vendor/sum";
console.log("sum(1, 2) = ", sum(1, 2));
var minus = require("./vendor/minus");
console.log("minus(1, 2) = ", minus(1, 2));
require(["./vendor/multi"], function(multi) {
  console.log("multi(1, 2) = ", multi(1, 2));
});

$.get(
  "/comments/hotflow",
  {
    id: "4263554020904293",
    mid: "4263554020904293",
    max_id_type: "0"
  },
  function(data) {
    console.log(data);
  }
);

if (module.hot) {
  // 检测是否有模块热更新
  module.hot.accept("./vendor/sum.js", function() {
    // 针对被更新的模块, 进行进一步操作
    console.log("/vendor/sum.js is changed");
  });
}

npm run dev 就可以看到结果了,由于开启了 source-map,所以可以定位代码位置。由于开起了热重载,当我们改变了 sum.js 就会自动执行编译


文章作者: 沐雪
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 沐雪 !
评论
 上一篇
Hello World Hello World
gogo macintosh迅雷这次非常给面子,很快就把将近 5G 的景象下完了。然后,用 transmac 刻录到 U 盘,非常顺利。考虑到正在写的一些项目都放到了 github 也就没有备份文件,刷刷刷,开始安装 心灵手巧,业务熟练的我
2018-03-01
下一篇 
learn-webpack4(十) learn-webpack4(十)
自动清理 dist 目录(clean plugin)&& watch modewebpack 配置把第一个例子搬过来用.注意 webpack 是倒叙的,所以把 CleanWebpackPlugin,放到最后 const we
2017-10-19
  目录