经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JSJS库框架 » JavaScript » 查看文章
webpack4 系列教程(十五):开发模式与webpack-dev-server
来源:cnblogs  作者:GodBMW  时间:2018/10/22 16:23:21  对本文有异议

作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步《webpack4 系列教程(十五):开发模式与 webpack-dev-server》原文地址。更欢迎来我的小站看更多原创内容:godbmw.com,进行“姿势”交流 ?(^?^*)

0. 课程介绍和资料

本节课的代码目录如下:

本节课用的 plugin 和 loader 的配置文件package.json如下:

  1. {
  2. "scripts": {
  3. "dev": "webpack-dev-server --open"
  4. },
  5. "devDependencies": {
  6. "clean-webpack-plugin": "^0.1.19",
  7. "html-webpack-plugin": "^3.2.0",
  8. "jquery": "^3.3.1",
  9. "webpack": "^4.16.1",
  10. "webpack-cli": "^3.1.0",
  11. "webpack-dev-server": "^3.1.4"
  12. }
  13. }

1. 为什么需要开发模式?

在之前的课程中,我们都没有指定参数mode。但是执行webpack进行打包的时候,自动设置为production,但是控制台会爆出warning的提示。而开发模式就是指定modedevelopment

在开发模式下,我们需要对代码进行调试。对应的配置就是:devtool设置为source-map。在非开发模式下,需要关闭此选项,以减小打包体积。

在开发模式下,还需要热重载、路由重定向、挂代理等功能,webpack4已经提供了devServer选项,启动一个本地服务器,让开发者使用这些功能。

2. 如何使用开发模式?

根据文章开头的package.json的配置,只需要在命令行输入:npm run dev即可启动开发者模式。

启动效果如下图所示:

虽然控制台输出了打包信息(假设我们已经配置了热重载),但是磁盘上并没有创建/dist/文件夹和打包文件。控制台的打包文件的相关内容是存储在内存之中的。

3. 编写一些需要的文件

首先,编写一下入口的 html 文件:

  1. <!-- index.html -->
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  8. <title>Document</title>
  9. </head>
  10. <body>
  11. This is Index html
  12. </body>
  13. </html>

然后,按照项目目录,简单封装下/vendor/下的三个 js 文件,以方便app.js调用:

  1. // minus.js
  2. module.exports = function(a, b) {
  3. return a - b;
  4. };
  5. // multi.js
  6. define(function(require, factory) {
  7. "use strict";
  8. return function(a, b) {
  9. return a * b;
  10. };
  11. });
  12. // sum.js
  13. export default function(a, b) {
  14. console.log("I am sum.js");
  15. return a + b;
  16. }

好了,准备进入正题。

4. 编写 webpack 配置文件

4.1 配置代码

由于配置内容有点多,所以放代码,再放讲解。

webpack.config.js配置如下所示:

  1. const webpack = require("webpack");
  2. const HtmlWebpackPlugin = require("html-webpack-plugin");
  3. const path = require("path");
  4. module.exports = {
  5. entry: {
  6. app: "./app.js"
  7. },
  8. output: {
  9. publicPath: "/",
  10. path: path.resolve(__dirname, "dist"),
  11. filename: "[name]-[hash:5].bundle.js",
  12. chunkFilename: "[name]-[hash:5].chunk.js"
  13. },
  14. mode: "development", // 开发模式
  15. devtool: "source-map", // 开启调试
  16. devServer: {
  17. contentBase: path.join(__dirname, "dist"),
  18. port: 8000, // 本地服务器端口号
  19. hot: true, // 热重载
  20. overlay: true, // 如果代码出错,会在浏览器页面弹出“浮动层”。类似于 vue-cli 等脚手架
  21. proxy: {
  22. // 跨域代理转发
  23. "/comments": {
  24. target: "https://m.weibo.cn",
  25. changeOrigin: true,
  26. logLevel: "debug",
  27. headers: {
  28. Cookie: ""
  29. }
  30. }
  31. },
  32. historyApiFallback: {
  33. // HTML5 history模式
  34. rewrites: [{ from: /.*/, to: "/index.html" }]
  35. }
  36. },
  37. plugins: [
  38. new HtmlWebpackPlugin({
  39. filename: "index.html",
  40. template: "./index.html",
  41. chunks: ["app"]
  42. }),
  43. new webpack.HotModuleReplacementPlugin(),
  44. new webpack.NamedModulesPlugin(),
  45. new webpack.ProvidePlugin({
  46. $: "jquery"
  47. })
  48. ]
  49. };

4.2 模块热更新

模块热更新需要HotModuleReplacementPluginNamedModulesPlugin这两个插件,并且顺序不能错。并且指定devServer.hottrue

有了这两个插件,在项目的 js 代码中可以针对侦测到变更的文件并且做出相关处理。

比如,我们启动开发模式后,修改了vendor/sum.js这个文件,此时,需要在浏览器的控制台打印一些信息。那么,app.js中就可以这么写:

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

每当sum.js被修改后,都可以自动执行回调函数。

4.3 跨域代理

随着前后端分离开发的普及,跨域请求变得越来越常见。为了快速开发,可以利用devServer.proxy做一个代理转发,来绕过浏览器的跨域限制。

按照前面的配置文件,如果想调用微博的一个接口:https://m.weibo.cn/comments/hotflow。只需要在代码中对/comments/hotflow进行请求即可:

  1. $.get(
  2. "/comments/hotflow",
  3. {
  4. id: "4263554020904293",
  5. mid: "4263554020904293",
  6. max_id_type: "0"
  7. },
  8. function(data) {
  9. console.log(data);
  10. }
  11. );

4.4 HTML5--History

当项目使用HTML5 History API 时,任意的 404 响应都可能需要被替代为 index.html

在 SPA(单页应用)中,任何响应直接被替代为index.html

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

  1. // ...
  2. historyApiFallback: {
  3. rewrites: [{ from: /.*/, to: "/index.html" }];
  4. }
  5. // ...

5. 编写入口文件

最后,在前面所有的基础上,让我们来编写下入口文件app.js

  1. import sum from "./vendor/sum";
  2. console.log("sum(1, 2) = ", sum(1, 2));
  3. var minus = require("./vendor/minus");
  4. console.log("minus(1, 2) = ", minus(1, 2));
  5. require(["./vendor/multi"], function(multi) {
  6. console.log("multi(1, 2) = ", multi(1, 2));
  7. });
  8. $.get(
  9. "/comments/hotflow",
  10. {
  11. id: "4263554020904293",
  12. mid: "4263554020904293",
  13. max_id_type: "0"
  14. },
  15. function(data) {
  16. console.log(data);
  17. }
  18. );
  19. if (module.hot) {
  20. // 检测是否有模块热更新
  21. module.hot.accept("./vendor/sum.js", function() {
  22. // 针对被更新的模块, 进行进一步操作
  23. console.log("/vendor/sum.js is changed");
  24. });
  25. }

6. 效果检测

在命令行键入:npm run dev开启服务器后,会自动打开浏览器。如下图所示:

打开控制台,可以看到代码都正常运行没有出错。除此之外,由于开启了source-map,所以可以定位代码位置(下图绿框内):

7. 参考资料

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号