解决方法
在package.json中"scripts"加入 dev": "vue-cli-service serve然后npm run dev
我的引申
1.vue3中package.json是什么?
在Node.js中,模块是一个库或框架,也是一个Node.js项目。Node.js项目遵循模块化的架构,当我们创建了一个Node.js项目,意味着创建了一个模块,这个模块的描述文件,被称为package.json。依赖包也是通过它来安装的。
package.json定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install 命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
vue-cli-service serve是什么?
vue-cli-service serve
命令会启动一个开发服务器 (基于 webpack-dev-server) 并附带开箱即用的模块热重载 (Hot-Module-Replacement)。
2.模块热重载 (Hot-Module-Replacement)
模块热替换(HMR - Hot Module Replacement)功能会在应用程序运行过程中替换、添加或删除模块,而无需重新加载整个页面。主要是通过以下几种方式,来显著加快开发速度:
- 保留在完全重新加载页面时丢失的应用程序状态。
- 只更新变更内容,以节省宝贵的开发时间。
- 调整样式更加快速 - 几乎相当于在浏览器调试器中更改样式。
2.1模块热重载的工作原理
2.1.1在应用程序中
sequenceDiagram
应用程序代码-->>HMR runtime: 检查更新
HMR runtime-)应用程序代码: 异步下载更新,通知应用程序代码
应用程序代码-->>HMR runtime: 应用更新
HMR runtime-)应用程序代码: 同步应用更新
runtime 包含:在模块交互时,连接模块所需的加载和解析逻辑。包括浏览器中的已加载模块的连接,以及懒加载模块的执行逻辑。
2.1.2在编译器中
除了普通资源,编译器需要发出 "update",以允许更新之前的版本到新的版本。"update" 由两部分组成:
- 更新后的 manifest(JSON)
- 一个或多个更新后的 chunk (JavaScript) "Manifest":当编译器开始执行、解析和映射应用程序时,它会保留所有模块的详细要点。这个数据集合称为"Manifest" ,当完成打包并发送到浏览器时,会在运行时通过 Manifest 来解析和加载模块。
manifest 包括新的编译 hash 和所有的待更新 chunk 目录。每个更新 chunk 都含有对应于此 chunk 的全部更新模块(或一个 flag 用于表明此模块要被移除)的代码。
编译器确保模块 ID 和 chunk ID 在这些构建之间保持一致。通常将这些 ID 存储在内存中(例如,使用webpack-dev-server 时),但是也可能将它们存储在一个 JSON 文件中。
2.1.3在模块中
HMR 是可选功能,只会影响包含 HMR 代码的模块。
2.1.4 在 HMR Runtime 中
对于模块系统的 runtime,附加的代码被发送到 parents
和 children
跟踪模块。在管理方面,runtime 支持两个方法 check
和 apply
。
apply
方法将所有被更新模块标记为无效。对于每个无效模块,都需要在模块中有一个更新处理函数,或者在它的父级模块们中有更新处理函数。否则,无效标记冒泡,并也使父级无效。每个冒泡继续,直到到达应用程序入口起点,或者到达带有更新处理函数的模块(以最先到达为准,冒泡停止)。如果它从入口起点开始冒泡,则此过程失败。
之后,所有无效模块都被(通过 dispose 处理函数)处理和解除加载。然后更新当前 hash,并且调用所有 "accept" 处理函数。runtime 切换回闲置
状态(idle state),一切照常继续。