当前位置: 首页 > news >正文

54 npm run serve 和 npm run build 输出的关联和差异

前言

通常来说 我们开发的时候一般会用到的命令是 “npm run serve”, “npm run build” 

前者会编译当前项目, 然后将编译之后的结果以 node 的形式启动一个服务, 暴露相关业务资源, 因此 我们可以通过 该服务访问到当前项目

后者是编译当前项目, 然后做一下最小化代码的优化处理

我们一般可能仅仅是使用到这两个命令, 然后 这里我们来看一下 这些命令中的一些细节

内容的篇幅, 略长 略多, 需要耐心, 并且需要 跟着文档中的断点, 上下文 进行调试 才有效果

 

 

测试用例

使用如下命令创建一个最简单的 vue 项目

npm i -g @vue/cli
npm i -g @vue/cli-service
vue create hello-package 

1af063d2fdd64b12937b914a7ff91f64.png

 

更新 HelloWorld 内容如下

<template><div class="hello"><h1>{{ msg }}</h1></div>
</template><script>
export default {name: 'HelloWorld',props: {msg: String}
}
</script><!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
h3 {margin: 40px 0 0;
}ul {list-style-type: none;padding: 0;
}li {display: inline-block;margin: 0 10px;
}a {color: #42b983;
}
</style>

 

执行 npm run build 之后生成的目录结构如下

2ffa5b4eb73448b09ded992c2bbfd11b.png

 

npm run serve 执行暴露的目录结构如下, 和上面相比 就是少了 css 的数据

0d43ed9cd8504fffa7f0306771b8165f.png

 

 

npm run serve/build 如何区分的 chunk-venders 和 app ?

这个主要是在这里, 获取目标文件的分组, 如果分组中包含了 defaultVendors 则分到 chunk-vendors 中

然后下面的 addModuleToChunksInfoMap 会将 module 和 chunk-vendors 进行关联起来

a0f067ad28f447358ec7625b59691cd1.png

 

判断是会否包含 defaultVendors 的分组的规则如下

假设这里 option.type, option.layer 为 undefined 的情况下, 判断方式为 context 中是否包含 “/nodule_modules/” 或者 “\node_modules\” 

e454b41063e64f5eb46262bdd1f681e7.png

 

在编译代码的时候, 获取上下文, 然后输出 对应的 chunk 信息

c3f21e26c19a48bdb46e95d61b9cb28e.png

 

输出 hello-package 的所有的模块以及对应的 chunk 信息如下

D:\WebstormWorkStations\hello-package\node_modules\webpack\hot\dev-server.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\src\main.js  --  app
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\index.js?protocol=ws&hostname=10.60.5.16&port=8081&pathname=%2Fws&logging=none&progress=true&overlay=%7B%22errors%22%3Atrue%2C%22warnings%22%3Afalse%7D&reconnect=10&hot=true&live-reload=true  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack\hot\log.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack\hot\log-apply-result.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack\hot\emitter.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\whatwg-fetch\fetch.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\socket.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\overlay.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\utils\stripAnsi.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\utils\parseURL.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\utils\log.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\utils\sendMessage.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\utils\reloadApp.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\utils\createSocketURL.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\vue\dist\vue.runtime.esm.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\src\App.vue  --  app
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\utils\getCurrentScriptSource.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\modules\es.array.push.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\clients\WebSocketClient.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\overlay\runtime-error.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\overlay\state-machine.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\overlay\styles.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\modules\web.url-search-params.delete.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\modules\web.url-search-params.has.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\modules\web.url-search-params.size.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=script&lang=js  --  app
D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=template&id=7ba5bd90  --  app
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\modules\logger\index.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\babel-loader\lib\index.js??clonedRuleSet-40.use[0]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=script&lang=js  --  app
D:\WebstormWorkStations\hello-package\node_modules\babel-loader\lib\index.js??clonedRuleSet-40.use[0]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\templateLoader.js??ruleSet[1].rules[3]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=template&id=7ba5bd90  --  app
D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\runtime\componentNormalizer.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\events\events.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\webpack-dev-server\client\overlay\fsm.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\export.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\to-object.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\length-of-array-like.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\array-set-length.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\does-not-exceed-safe-integer.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\fails.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\define-built-in.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\function-uncurry-this.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\to-string.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\validate-arguments-length.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\descriptors.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\define-built-in-accessor.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=style&index=0&id=7ba5bd90&lang=css  --  app
D:\WebstormWorkStations\hello-package\node_modules\vue-hot-reload-api\dist\index.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\vue-style-loader\index.js??clonedRuleSet-12.use[0]!D:\WebstormWorkStations\hello-package\node_modules\css-loader\dist\cjs.js??clonedRuleSet-12.use[1]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\stylePostLoader.js!D:\WebstormWorkStations\hello-package\node_modules\postcss-loader\dist\cjs.js??clonedRuleSet-12.use[2]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=style&index=0&id=7ba5bd90&lang=css  --  app
D:\WebstormWorkStations\hello-package\node_modules\core-js\modules\web.immediate.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\css-loader\dist\cjs.js??clonedRuleSet-12.use[1]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\stylePostLoader.js!D:\WebstormWorkStations\hello-package\node_modules\postcss-loader\dist\cjs.js??clonedRuleSet-12.use[2]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=style&index=0&id=7ba5bd90&lang=css  --  app
D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue  --  app
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\global.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\object-get-own-property-descriptor.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\create-non-enumerable-property.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\define-global-property.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\copy-constructor-properties.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\is-forced.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\require-object-coercible.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\to-length.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\is-array.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\is-callable.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\object-define-property.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\make-built-in.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\function-bind-native.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\classof.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\ansi-html-community\index.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=template&id=469af010&scoped=true  --  app
D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=script&lang=js  --  app
D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=style&index=0&id=469af010&scoped=true&lang=css  --  app
D:\WebstormWorkStations\hello-package\node_modules\vue-style-loader\lib\addStylesClient.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\html-entities\lib\index.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\modules\web.clear-immediate.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\babel-loader\lib\index.js??clonedRuleSet-40.use[0]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=script&lang=js  --  app
D:\WebstormWorkStations\hello-package\node_modules\babel-loader\lib\index.js??clonedRuleSet-40.use[0]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\templateLoader.js??ruleSet[1].rules[3]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=template&id=469af010&scoped=true  --  app
D:\WebstormWorkStations\hello-package\node_modules\vue-style-loader\index.js??clonedRuleSet-12.use[0]!D:\WebstormWorkStations\hello-package\node_modules\css-loader\dist\cjs.js??clonedRuleSet-12.use[1]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\stylePostLoader.js!D:\WebstormWorkStations\hello-package\node_modules\postcss-loader\dist\cjs.js??clonedRuleSet-12.use[2]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=style&index=0&id=469af010&scoped=true&lang=css  --  app
D:\WebstormWorkStations\hello-package\node_modules\core-js\modules\web.set-immediate.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\css-loader\dist\cjs.js??clonedRuleSet-12.use[1]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\stylePostLoader.js!D:\WebstormWorkStations\hello-package\node_modules\postcss-loader\dist\cjs.js??clonedRuleSet-12.use[2]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=style&index=0&id=469af010&scoped=true&lang=css  --  app
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\function-call.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\object-property-is-enumerable.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\create-property-descriptor.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\to-indexed-object.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\to-property-key.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\has-own-property.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\ie8-dom-define.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\own-keys.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\is-null-or-undefined.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\to-integer-or-infinity.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\classof-raw.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\v8-prototype-define-bug.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\an-object.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\function-name.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\inspect-source.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\internal-state.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\to-string-tag-support.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\well-known-symbol.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\vue-style-loader\lib\listToStyles.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\task.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\schedulers-fix.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\indexed-object.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\to-primitive.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\is-symbol.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\document-create-element.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\get-built-in.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\object-get-own-property-names.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\object-get-own-property-symbols.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\math-trunc.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\is-object.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\weak-map-basic-detection.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\shared-store.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\shared-key.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\hidden-keys.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\shared.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\uid.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\symbol-constructor-detection.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\use-symbol-as-uid.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\html-entities\lib\named-references.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\html-entities\lib\numeric-unicode-map.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\html-entities\lib\surrogate-pairs.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\function-apply.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\function-bind-context.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\html.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\array-slice.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\engine-is-ios.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\engine-is-node.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\engine-is-bun.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\engine-user-agent.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\get-method.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\ordinary-to-primitive.js  --  chunk-vendorsD:\WebstormWorkStations\hello-package\node_modules\core-js\internals\object-is-prototype-of.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\object-keys-internal.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\enum-bug-keys.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\is-pure.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\engine-v8-version.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\function-uncurry-this-clause.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\a-callable.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\array-includes.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\try-to-string.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\core-js\internals\to-absolute-index.js  --  chunk-vendors
D:\WebstormWorkStations\hello-package\node_modules\css-loader\dist\runtime\noSourceMaps.js  --  chunk-vendors

 

其中 app 相关的 module 如下

一个 Vue 文件会拆分成相关联的 8 个文件

src\components\HelloWorld.vue 对应的是一个组合文件, 组合了三个代理文件

"src\components\HelloWorld.vue?vue&type=template&id=469af010&scoped=true"
"src\components\HelloWorld.vue?vue&type=script&lang=js"
"src\components\HelloWorld.vue?vue&type=style&index=0&id=469af010&scoped=true&lang=css" 分别是 template, javascript, css 三个代理文件

 

剩余四个文件分别是 会关联真实的 根据HTML模板生成的 render 函数, js数据结构, css相关的样式文件有两个

D:\WebstormWorkStations\hello-package\src\main.js  --  appD:\WebstormWorkStations\hello-package\src\App.vue  --  app
D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=script&lang=js  --  app
D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=template&id=7ba5bd90  --  app
D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=style&index=0&id=7ba5bd90&lang=css  --  app
D:\WebstormWorkStations\hello-package\node_modules\babel-loader\lib\index.js??clonedRuleSet-40.use[0]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=script&lang=js  --  app
D:\WebstormWorkStations\hello-package\node_modules\babel-loader\lib\index.js??clonedRuleSet-40.use[0]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\templateLoader.js??ruleSet[1].rules[3]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=template&id=7ba5bd90  --  app
D:\WebstormWorkStations\hello-package\node_modules\vue-style-loader\index.js??clonedRuleSet-12.use[0]!D:\WebstormWorkStations\hello-package\node_modules\css-loader\dist\cjs.js??clonedRuleSet-12.use[1]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\stylePostLoader.js!D:\WebstormWorkStations\hello-package\node_modules\postcss-loader\dist\cjs.js??clonedRuleSet-12.use[2]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=style&index=0&id=7ba5bd90&lang=css  --  app
D:\WebstormWorkStations\hello-package\node_modules\css-loader\dist\cjs.js??clonedRuleSet-12.use[1]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\stylePostLoader.js!D:\WebstormWorkStations\hello-package\node_modules\postcss-loader\dist\cjs.js??clonedRuleSet-12.use[2]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\App.vue?vue&type=style&index=0&id=7ba5bd90&lang=css  --  appD:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue  --  app
D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=template&id=469af010&scoped=true  --  app
D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=script&lang=js  --  app
D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=style&index=0&id=469af010&scoped=true&lang=css  --  app
D:\WebstormWorkStations\hello-package\node_modules\babel-loader\lib\index.js??clonedRuleSet-40.use[0]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=script&lang=js  --  app
D:\WebstormWorkStations\hello-package\node_modules\babel-loader\lib\index.js??clonedRuleSet-40.use[0]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\templateLoader.js??ruleSet[1].rules[3]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=template&id=469af010&scoped=true  --  app
D:\WebstormWorkStations\hello-package\node_modules\vue-style-loader\index.js??clonedRuleSet-12.use[0]!D:\WebstormWorkStations\hello-package\node_modules\css-loader\dist\cjs.js??clonedRuleSet-12.use[1]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\stylePostLoader.js!D:\WebstormWorkStations\hello-package\node_modules\postcss-loader\dist\cjs.js??clonedRuleSet-12.use[2]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=style&index=0&id=469af010&scoped=true&lang=css  --  app
D:\WebstormWorkStations\hello-package\node_modules\css-loader\dist\cjs.js??clonedRuleSet-12.use[1]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\loaders\stylePostLoader.js!D:\WebstormWorkStations\hello-package\node_modules\postcss-loader\dist\cjs.js??clonedRuleSet-12.use[2]!D:\WebstormWorkStations\hello-package\node_modules\@vue\vue-loader-v15\lib\index.js??vue-loader-options!D:\WebstormWorkStations\hello-package\src\components\HelloWorld.vue?vue&type=style&index=0&id=469af010&scoped=true&lang=css  --  app

 

 

npm run serve 中一个 vue 文件生成的多个 js 部分

1. src\components\HelloWorld.vue

它大概就是 组合了下面的 模板, js, css 的三个代理文件, 然后 初始化组件之类的操作

下面包含一部分 热部署的代码

6a762012020840e4b781e977ff3eaa3e.png

 

2. 模板, js, css 三个代理文件

./src/components/HelloWorld.vue?vue&type=template&id=469af010&scoped=true 

模板关联的这个代理文件, 主要是引用了 vue-loader 基于 html 模板生成相关的加载之后的代码, 这里代理其 render 和 staticRenderFns

8baf02b0a7124d7c99e8f12fe0c018f4.png

 

./src/components/HelloWorld.vue?vue&type=script&lang=js

js关联的这个代理文件, 主要是引用了 vue-loader 基于 js 生成相关的加载之后的代码, 这里就是一个代理和导出  

793ae822aea64e0eb8d40127362d9be1.png

 

./src/components/HelloWorld.vue?vue&type=style&index=0&id=469af010&scoped=true&lang=css

css关联的这个代理文件, 主要是引用了 vue-loader 基于 css 生成相关的加载之后的代码, 这里就是一个代理和导出  

97126f0e25db483c92a191f98a37a01a.png

 

3. 基于 vue-loader 加载的真实的 html, js, css 的代码

vue-loader 加载的 html 模板部分

这部分就是 vue 文件中 html模板部分 渲染之后的 render 函数部分, 这部分主要是包含了 视图模板, 和下面面的 视图样式部分 共同构成了 MVC 中的 View  

e6fdbf25cd5a44d68b372fae682c4f00.png

 

vue-loader 加载的 js 部分

这部分就是业务处理部分, 包含了 数据模型, 数据控制逻辑, MVC 中的 Model 和 Controller 部分

caa9c81527b5492ab835c6bd78d00853.png

 

vue-loader 加载的 css 部分

这部分和上面的 视图模板部分 共同构成了 MVC 中的 View

a37e4aefdadc4ed3a666871de70bd3d4.png

 

 

以上各个部分的模板代码的生成在哪里?

1. 基于 vue-loader 加载的真实的 html, js, css 的代码

编译真实的 html模板 为组件的 render 函数

在 templateLoader.js 往下看

759e712de0544a19b72e2ad63470bd12.png

 

编译真实的 js 的地方在这里

d0ef01939a364c1aa4429215bdd7b5c4.png

 

处理真实的 css 的地方在这里, 前面已经有将 样式部分提取到了 descriptor.styles 中, 这里直接使用就好了

bda50d86e5424f2f9cde58db215b772f.png

 

2. 生成 src\components\HelloWorld.vue 

这一部分的处理是在这里, “node_modules\@vue\vue-loader-v15\lib\index.js” 

894089fcd4bc4ddd83360b8bcc913c65.png

 

3. 模板, js, css 三个代理文件

生成 模板 的代理文件是在这里

73b83761bc4b4cf4985d0aef3cfb819b.png

 

生成 js 的代理文件是在这里

9c4dcd34ce614af183080e0c0f7a22ad.png

 

生成 css 的代理文件是在这里

3308fecd2ff14926a0985d564bcfaecb.png

 

 

npm run serve 的情况下 app.js 的组成

访问 app.js, 得到内容大概如下

7b4941bb198e4f0fac64fe5b852f37c2.png

 

主要是分成了几个部分

webpack的一部分前置部分 + 用户代码的代码文件分解出来各个js部分 + The module cache + webpack/runtime/*的十来个运行时的类库 + webpack 的后置部分代码

 

webpackBootstrap 部分是来自于如下

78b99d10cf6b404a840a2e477dcf6a26.png

 

各个 module 的编译解析, 在如下地方

4e26671fd78b4600823ec5fa75dc9768.png

 

module cache 部分渲染是在这里, module 的添加之后  

2a9ba25c64304978bbdc6e54c9896bdb.png

 

接着是 webpack 的各个 runtime 的类库的添加

e8abe5ab02c44233a3fc072889ef17c3.png

 

webpack 的后置部分是在如下部分添加的

94a49eb989e14f8fba0fae506286de53.png

 

 

npm run serve 的情况下 chunk-vendors.js 的组成

对于 chunk-vendors.js 这里不是我们关心的重点, 而且 一般相对标准的类库 不会出现较大的问题

然后 它的组成里面, 就是可以理解为 使用到的所有的 js 汇聚在一起的一个集合, 然后 压缩了一下

从 chunk-vendors.js 中搜索所有的 js 文件, 可以看到有 123 个 js 文件

869e75834a49429c98bc4c74676e2b0f.png

 

然后 我们看一下在 代码编译的过程中所有的 node_modules 的 js 文件, 可以看到 也是 123 个

2d01116cd9b14ae083ba543ba0bcd849.png

 

渲染 chunk-vendors.js 的各个 模块如下, 至于更加详细的细节 我们就不往下看了

655beaf94286496799c3e6d5c46a078a.png

 

 

npm run serve 中每个 vue 文件的一个 id 的生成规则

比如上面的 “src/components/HelloWorld.vue”的 id 为 “469af010” 

具体的生成规则如下, 我们这里不是 production, 是直接为文件路径生成了一个 摘要

fe0c10d2917b440284710dbe217c78d1.png

 

摘要的具体生成方式如下

912c6bfab52f4f32865dbbd4ee96a8d1.png

 

 

npm run build 中每个 css/js 文件的一个 id 的生成规则

npm run build 之后, js, css 文件信息如下

755827f7f2b74f67b26973dc6d546914.png

 

js 文件的 id 生成规则如下, 包含了 头部信息, 模块信息, webpack运行时模块信息, 整个过程的计算比较复杂

0c3c3dd2c9a946eab6574d8e39ee31cd.png

 

css 文件的 id 生成规则如下, 包含了 模块信息, 整个程的计算比较复杂

93bbf8ea20aa484ca2509f668a0dabca.png

 

 

npm run build 中的 app.js, chunk-vendors.js

app.js, chunk-vendors.js 编译的时候, 最终需要做的 transformation

下图 input 中 js 为 app.js 原始的样子, 和 npm run serve 编译之后的代码差异不大, 可以理解为是一样的, 仅仅是去掉了一部分热部署的代码 以及 一部分开发时需要的特殊代码

然后这里的 “await (getWorker ? getWorker().transform(getSerializeJavascript()(options)) : minify(options));” 进行 transformation, 实际上 worker 这里的处理 仅仅只有 minify(options) 

这里面会对改 app.js 进行 代码的最小化, 函数内联, 变量的替换, 去掉无用的空格, 等等相关处理

4e6ba77dcf864dfd895d56ffd948e2d6.png

 

最小化的处理, 要么是在当前线程 或者 子线程进行处理

6419969b4be44703ad4ed427cb79729c.png

 

npm run build 的时候 app.js 处理之前的代码如下文件

/******/
(function () { // webpackBootstrap/******/"use strict";/******/var __webpack_modules__ = ({/***/ 6220:/***/ (function (__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {// EXTERNAL MODULE: ./node_modules/vue/dist/vue.runtime.esm.jsvar vue_runtime_esm = __webpack_require__(6848);;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/App.vue?vue&type=template&id=78e91b77var render = function render() {var _vm = this,_c = _vm._self._c;return _c('div', {attrs: {"id": "app"}}, [_c('HelloWorld', {attrs: {"msg": "this is test"}})], 1);};var staticRenderFns = [];;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/HelloWorld.vue?vue&type=template&id=14b82bca&scoped=truevar HelloWorldvue_type_template_id_14b82bca_scoped_true_render = function render() {var _vm = this,_c = _vm._self._c;return _c('div', {staticClass: "hello"}, [_c('h1', [_vm._v(_vm._s(_vm.msg))])]);};var HelloWorldvue_type_template_id_14b82bca_scoped_true_staticRenderFns = [];;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/HelloWorld.vue?vue&type=script&lang=js/* harmony default export */var HelloWorldvue_type_script_lang_js = ({name: 'HelloWorld',props: {msg: String}});;// CONCATENATED MODULE: ./src/components/HelloWorld.vue?vue&type=script&lang=js/* harmony default export */var components_HelloWorldvue_type_script_lang_js = (HelloWorldvue_type_script_lang_js);;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/HelloWorld.vue?vue&type=style&index=0&id=14b82bca&prod&scoped=true&lang=css
// extracted by mini-css-extract-plugin;// CONCATENATED MODULE: ./src/components/HelloWorld.vue?vue&type=style&index=0&id=14b82bca&prod&scoped=true&lang=css// EXTERNAL MODULE: ./node_modules/@vue/vue-loader-v15/lib/runtime/componentNormalizer.jsvar componentNormalizer = __webpack_require__(1656);;// CONCATENATED MODULE: ./src/components/HelloWorld.vue;/* normalize component */var component = (0, componentNormalizer/* default */.A)(components_HelloWorldvue_type_script_lang_js,HelloWorldvue_type_template_id_14b82bca_scoped_true_render,HelloWorldvue_type_template_id_14b82bca_scoped_true_staticRenderFns,false,null,"14b82bca",null)/* harmony default export */var HelloWorld = (component.exports);;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-40.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/App.vue?vue&type=script&lang=js/* harmony default export */var Appvue_type_script_lang_js = ({name: 'App',components: {HelloWorld: HelloWorld}});;// CONCATENATED MODULE: ./src/App.vue?vue&type=script&lang=js/* harmony default export */var src_Appvue_type_script_lang_js = (Appvue_type_script_lang_js);;// CONCATENATED MODULE: ./node_modules/mini-css-extract-plugin/dist/loader.js??clonedRuleSet-12.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-12.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-12.use[2]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/App.vue?vue&type=style&index=0&id=78e91b77&prod&lang=css
// extracted by mini-css-extract-plugin;// CONCATENATED MODULE: ./src/App.vue?vue&type=style&index=0&id=78e91b77&prod&lang=css;// CONCATENATED MODULE: ./src/App.vue;/* normalize component */var App_component = (0, componentNormalizer/* default */.A)(src_Appvue_type_script_lang_js,render,staticRenderFns,false,null,null,null)/* harmony default export */var App = (App_component.exports);;// CONCATENATED MODULE: ./src/main.jsvue_runtime_esm/* default */.Ay.config.productionTip = false;new vue_runtime_esm/* default */.Ay({render: h => h(App)}).$mount('#app');/***/})/******/});/************************************************************************//******/ 	// The module cache/******/var __webpack_module_cache__ = {};/******//******/ 	// The require function/******/function __webpack_require__(moduleId) {/******/ 		// Check if module is in cache/******/var cachedModule = __webpack_module_cache__[moduleId];/******/if (cachedModule !== undefined) {/******/return cachedModule.exports;/******/}/******/ 		// Create a new module (and put it into the cache)/******/var module = __webpack_module_cache__[moduleId] = {/******/ 			// no module.id needed/******/ 			// no module.loaded needed/******/            exports: {}/******/};/******//******/ 		// Execute the module function/******/__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);/******//******/ 		// Return the exports of the module/******/return module.exports;/******/}/******//******/ 	// expose the modules object (__webpack_modules__)/******/__webpack_require__.m = __webpack_modules__;/******//************************************************************************//******/ 	/* webpack/runtime/chunk loaded *//******/!function () {/******/var deferred = [];/******/__webpack_require__.O = function (result, chunkIds, fn, priority) {/******/if (chunkIds) {/******/priority = priority || 0;/******/for (var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];/******/deferred[i] = [chunkIds, fn, priority];/******/return;/******/}/******/var notFulfilled = Infinity;/******/for (var i = 0; i < deferred.length; i++) {/******/var chunkIds = deferred[i][0];/******/var fn = deferred[i][1];/******/var priority = deferred[i][2];/******/var fulfilled = true;/******/for (var j = 0; j < chunkIds.length; j++) {/******/if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every(function (key) {return __webpack_require__.O[key](chunkIds[j]);})) {/******/chunkIds.splice(j--, 1);/******/} else {/******/fulfilled = false;/******/if (priority < notFulfilled) notFulfilled = priority;/******/}/******/}/******/if (fulfilled) {/******/deferred.splice(i--, 1)/******/var r = fn();/******/if (r !== undefined) result = r;/******/}/******/}/******/return result;/******/};/******/}();/******//******/ 	/* webpack/runtime/compat get default export *//******/!function () {/******/ 		// getDefaultExport function for compatibility with non-harmony modules/******/__webpack_require__.n = function (module) {/******/var getter = module && module.__esModule ?/******/                function () {return module['default'];} :/******/                function () {return module;};/******/__webpack_require__.d(getter, {a: getter});/******/return getter;/******/};/******/}();/******//******/ 	/* webpack/runtime/define property getters *//******/!function () {/******/ 		// define getter functions for harmony exports/******/__webpack_require__.d = function (exports, definition) {/******/for (var key in definition) {/******/if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {/******/Object.defineProperty(exports, key, {enumerable: true, get: definition[key]});/******/}/******/}/******/};/******/}();/******//******/ 	/* webpack/runtime/global *//******/!function () {/******/__webpack_require__.g = (function () {/******/if (typeof globalThis === 'object') return globalThis;/******/try {/******/return this || new Function('return this')();/******/} catch (e) {/******/if (typeof window === 'object') return window;/******/}/******/})();/******/}();/******//******/ 	/* webpack/runtime/hasOwnProperty shorthand *//******/!function () {/******/__webpack_require__.o = function (obj, prop) {return Object.prototype.hasOwnProperty.call(obj, prop);}/******/}();/******//******/ 	/* webpack/runtime/jsonp chunk loading *//******/!function () {/******/ 		// no baseURI/******//******/ 		// object to store loaded and loading chunks/******/ 		// undefined = chunk not loaded, null = chunk preloaded/prefetched/******/ 		// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded/******/var installedChunks = {/******/            524: 0/******/};/******//******/ 		// no chunk on demand loading/******//******/ 		// no prefetching/******//******/ 		// no preloaded/******//******/ 		// no HMR/******//******/ 		// no HMR manifest/******//******/__webpack_require__.O.j = function (chunkId) {return installedChunks[chunkId] === 0;};/******//******/ 		// install a JSONP callback for chunk loading/******/var webpackJsonpCallback = function (parentChunkLoadingFunction, data) {/******/var chunkIds = data[0];/******/var moreModules = data[1];/******/var runtime = data[2];/******/ 			// add "moreModules" to the modules object,/******/ 			// then flag all "chunkIds" as loaded and fire callback/******/var moduleId, chunkId, i = 0;/******/if (chunkIds.some(function (id) {return installedChunks[id] !== 0;})) {/******/for (moduleId in moreModules) {/******/if (__webpack_require__.o(moreModules, moduleId)) {/******/__webpack_require__.m[moduleId] = moreModules[moduleId];/******/}/******/}/******/if (runtime) var result = runtime(__webpack_require__);/******/}/******/if (parentChunkLoadingFunction) parentChunkLoadingFunction(data);/******/for (; i < chunkIds.length; i++) {/******/chunkId = chunkIds[i];/******/if (__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {/******/installedChunks[chunkId][0]();/******/}/******/installedChunks[chunkId] = 0;/******/}/******/return __webpack_require__.O(result);/******/}/******//******/var chunkLoadingGlobal = self["webpackChunkhello_package"] = self["webpackChunkhello_package"] || [];/******/chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));/******/chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));/******/}();/******//************************************************************************//******//******/ 	// startup/******/ 	// Load entry module and return exports/******/ 	// This entry module depends on other loaded chunks and execution need to be delayed/******/var __webpack_exports__ = __webpack_require__.O(undefined, [504], function () {return __webpack_require__(6220);})/******/__webpack_exports__ = __webpack_require__.O(__webpack_exports__);/******//******/
})()
;

 

npm run build 的时候 app.js 处理之后的代码如下文件

(function () {"use strict";var n = {6220: function (n, r, t) {var e = t(6848), o = function () {var n = this, r = n._self._c;return r("div", {attrs: {id: "app"}}, [r("HelloWorld", {attrs: {msg: "this is test"}})], 1)}, i = [], u = function () {var n = this, r = n._self._c;return r("div", {staticClass: "hello"}, [r("h1", [n._v(n._s(n.msg))])])}, l = [], c = {name: "HelloWorld", props: {msg: String}}, f = c, a = t(1656),s = (0, a.A)(f, u, l, !1, null, "14b82bca", null), p = s.exports,v = {name: "App", components: {HelloWorld: p}}, h = v, d = (0, a.A)(h, o, i, !1, null, null, null),b = d.exports;e.Ay.config.productionTip = !1, new e.Ay({render: n => n(b)}).$mount("#app")}}, r = {};function t(e) {var o = r[e];if (void 0 !== o) return o.exports;var i = r[e] = {exports: {}};return n[e].call(i.exports, i, i.exports, t), i.exports}t.m = n, function () {var n = [];t.O = function (r, e, o, i) {if (!e) {var u = 1 / 0;for (a = 0; a < n.length; a++) {e = n[a][0], o = n[a][1], i = n[a][2];for (var l = !0, c = 0; c < e.length; c++) (!1 & i || u >= i) && Object.keys(t.O).every((function (n) {return t.O[n](e[c])})) ? e.splice(c--, 1) : (l = !1, i < u && (u = i));if (l) {n.splice(a--, 1);var f = o();void 0 !== f && (r = f)}}return r}i = i || 0;for (var a = n.length; a > 0 && n[a - 1][2] > i; a--) n[a] = n[a - 1];n[a] = [e, o, i]}}(), function () {t.n = function (n) {var r = n && n.__esModule ? function () {return n["default"]} : function () {return n};return t.d(r, {a: r}), r}}(), function () {t.d = function (n, r) {for (var e in r) t.o(r, e) && !t.o(n, e) && Object.defineProperty(n, e, {enumerable: !0, get: r[e]})}}(), function () {t.g = function () {if ("object" === typeof globalThis) return globalThis;try {return this || new Function("return this")()} catch (n) {if ("object" === typeof window) return window}}()}(), function () {t.o = function (n, r) {return Object.prototype.hasOwnProperty.call(n, r)}}(), function () {var n = {524: 0};t.O.j = function (r) {return 0 === n[r]};var r = function (r, e) {var o, i, u = e[0], l = e[1], c = e[2], f = 0;if (u.some((function (r) {return 0 !== n[r]}))) {for (o in l) t.o(l, o) && (t.m[o] = l[o]);if (c) var a = c(t)}for (r && r(e); f < u.length; f++) i = u[f], t.o(n, i) && n[i] && n[i][0](), n[i] = 0;return t.O(a)}, e = self["webpackChunkhello_package"] = self["webpackChunkhello_package"] || [];e.forEach(r.bind(null, 0)), e.push = r.bind(null, e.push.bind(e))}();var e = t.O(void 0, [504], (function () {return t(6220)}));e = t.O(e)
})();

 

处理之前大小为 18kb, 处理之后为 3kb

整个文件 也是分成了四个部分, 业务代码部分 + The module cache + webpack/runtime/*各个运行时类库 + entryPoint部分代码

EntryPoint 部分代码, 主要是 驱动业务代码

 

这里大概看一下 app.js 的业务代码部分, 这里的实现和 npm run serve 拿到的 app.js 的实现具体逻辑是一样的, 只是 npm run servce 需要实现一部分特定的开发模式下的特性, 做了一些代理处理, 所以 看着更加复杂一些

app.js 里面主要是分为了几个步骤, HelloWorld.vue 组件的定义, App.vue 组件的定义, main.js作为入口的定义

 

HelloWorld.vue 组件的定义如下, 这里主要是包含了 HelloWorld 的 html模板数据, js处理逻辑, css样式数据, 然后 componentNormalizer 来组合了这几个部分, 定义了 HelloWorld 的组件

98fb1f81e1bb410d964611015619042b.png

 

App.vue 组件的定义如下, 这里主要是包含了 App 的 html模板数据, js处理逻辑, css样式数据, 然后 componentNormalizer 来组合了这几个部分, 定义了 App 的组件

0abdc7d8018c4b17a00c090eeb453884.png

 

 

然后剩下一部分就是 main.js作为入口的定义

这就是 main.js 为什么命名为 main 的原因了

4cbae6b2bb5f431486071092060364b9.png

 

 

完 

 

 

 

相关文章:

54 npm run serve 和 npm run build 输出的关联和差异

前言 通常来说 我们开发的时候一般会用到的命令是 “npm run serve”, “npm run build” 前者会编译当前项目, 然后将编译之后的结果以 node 的形式启动一个服务, 暴露相关业务资源, 因此 我们可以通过 该服务访问到当前项目 后者是编译当前项目, 然后做一下最小化代码的优…...

iOS —— 初识KVO

iOS —— 初始KVO KVO的基础1. KVO概念2. KVO使用步骤注册KVO监听实现KVO监听销毁KVO监听 3. KVO基本用法4. KVO传值禁止KVO的方法 注意事项&#xff1a; KVO的基础 1. KVO概念 KVO是一种开发模式&#xff0c;它的全称是Key-Value Observing (观察者模式) 是苹果Fundation框架…...

什么是HTTP? HTTP 和 HTTPS 的区别?

文章目录 一、HTTP二、HTTPS三、区别参考文献 一、HTTP HTTP (HyperText Transfer Protocol)&#xff0c;即超文本运输协议&#xff0c;是实现网络通信的一种规范 在计算机和网络世界有&#xff0c;存在不同的协议&#xff0c;如广播协议、寻址协议、路由协议等等… 而HTTP是…...

微信小程序如何进行npm导入组件

文章目录 目录 文章目录 前言 一、安装node 二、微信小程序通过npm安装组件&#xff08;以Vant-weapp为例&#xff09; 一、Vant-weapp下载 二 、修改 app.json 三 、修改 project.config.json 四 、 构建 npm 包 前言 微信小程序使用npm导入有很多的教程&#xff0c;我…...

MySQL编程实战LeetCode经典考题

文章简介 本文主要收集了LeetCode上关于MySQL的一些经典考题。 后续也会陆续把所有经典考题补充完整。 175.组合两个表 175.组合两个表 解答&#xff1a; select p.FirstName as firstName, p.LastName as lastName,a.City as city, a.State as state from Person p l…...

发生播放错误,即将重试 jellyfin

上周在家里的小主机上部署了jellyfin&#xff0c;真香&#xff0c;手机安卓端使用无问题&#xff0c;于是今天准备在电视上安装一个 首先是直接安装的手机版客户端&#xff0c;操作卡顿&#xff0c;而且很多操作没法实现&#xff0c;于是去下了一个tv版本 安装上后发现&#…...

BIONIOAIO

通信技术整体解决的问题 1.局域网内的通信要求 2.多系统间的底层消息传递机制 3.高并发下&#xff0c;大数据量的通信场景需要 4.游戏行业。无论是手游服务端、还是大型网络游戏&#xff0c;java的应用越来越广 IO模型基本说明 就是用什么样的通道或者说是通信模式和架构…...

SpringSecurity学习总结(三更草堂)

SpringSecurity安全框架的核心功能是认证和授权&#xff1a; 认证&#xff1a;验证当前访问系统的是不是本系统的用户&#xff0c;并且要确认具体是哪个用户。 授权&#xff1a;经过认证后判断当前用户是否具有进行某个操作的权限。 一般来说中大型的项目都是使用SpringSecurit…...

C++20中的jthread

一、多线程开发 c11以前&#xff0c;是不包含线程库的&#xff0c;开发多线程&#xff0c;必须使用OS系统自带的线程API&#xff0c;这就导致了很多问题&#xff0c;最主要的是&#xff0c;跨平台的开发&#xff0c;一般要保持几个主流应用的库的代码支持&#xff0c;特别是对…...

Xception模型详解

简介 Xception的名称源自于"Extreme Inception"&#xff0c;它是在Inception架构的基础上进行了扩展和改进。Inception架构是Google团队提出的一种经典的卷积神经网络架构&#xff0c;用于解决深度卷积神经网络中的计算和参数增长问题。 与Inception不同&#xff0…...

【合合TextIn】AI构建新质生产力,合合信息Embedding模型助力专业知识应用

目录 一、合合信息acge模型获MTEB中文榜单第一 二、MTEB与C-MTEB 三、Embedding模型的意义 四、合合信息acge模型 &#xff08;一&#xff09;acge模型特点 &#xff08;二&#xff09;acge模型功能 &#xff08;三&#xff09;acge模型优势 五、公司介绍 一、合合信息…...

Flutter 拦截系统键盘,显示自定义键盘

一、这里记录下在开发过程中&#xff0c;下单的时候输入金额需要使用自定义的数字键盘 参考链接: https://juejin.cn/post/7166046328609308685 效果图 二、屏蔽系统键盘 怎样才能够在输入框获取焦点的时候&#xff0c;不让系统键盘弹出呢&#xff1f;同时又显示我们自定义的…...

内存泄漏是什么?如何避免内存泄漏?

1.2 内存泄漏 使用new开辟空间泄漏&#xff0c;抛出异常 int main() {int size 0;try{while (1){//int* p (int*)malloc(sizeof(int) * 1024 * 1024);/*if (p NULL){break;}*/int* p new int[1024 * 1024];size size 4 * 1024 * 1024;cout << p << endl;}}…...

linux 中的syslog的含义和用法

在Linux系统中&#xff0c;syslog是一种系统日志服务&#xff0c;用于收集、存储和管理系统和应用程序生成的日志消息。syslog服务负责记录系统的运行状态、错误信息、警告、调试信息等&#xff0c;以便系统管理员可以监控系统的健康状况、故障排查和性能优化。 含义和作用&am…...

kubernetes(K8S)学习(一):K8S集群搭建(1 master 2 worker)

K8S集群搭建&#xff08;1 master 2 worker&#xff09; 一、环境资源准备1.1、版本统一1.2、k8s环境系统要求1.3、准备三台Centos7虚拟机 二、集群搭建2.1、更新yum&#xff0c;并安装依赖包2.2、安装Docker2.3、设置hostname&#xff0c;修改hosts文件2.4、设置k8s的系统要求…...

巧克力(蓝桥杯)

文章目录 巧克力题目描述解题分析贪心 巧克力 题目描述 小蓝很喜欢吃巧克力&#xff0c;他每天都要吃一块巧克力。 一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力&#xff0c;每种巧克力有自己的价格、数量和剩余的保质期天数&#xff0c;小蓝只吃没过保质期的…...

Python爬虫之pyquery和parsel的使用

三、pyquery的使用 1、准备工作 pip3 install pyquery2、初始化 2.1、字符串初始化 把HTML的内容当做参数&#xff0c;来初始化PyQuery对象。 html <div><ul><li class"item-0">first item</li><li class"item-1">&l…...

移动硬盘怎么加密?移动硬盘加密软件有哪些?

移动硬盘是我们在工作中最常用的移动存储设备&#xff0c;为了保护数据安全&#xff0c;需要使用专业的移动硬盘加密软件加密保护。那么&#xff0c;移动硬盘加密软件有哪些&#xff1f; ​BitLocker BitLocker是Windows的磁盘加锁功能&#xff0c;可以用于加密保护移动硬盘中…...

openEuler 22.03 安装 .NET 8.0

openEuler 22.03 安装 .NET 8.0 openEuler 22.03 安装 .NET 8.0 openEuler 22.03 安装 .NET 8.0 查看内核信息 [jeffPC-20240314EIAA ~]$ cat /proc/version Linux version 5.15.146.1-microsoft-standard-WSL2 (root65c757a075e2) (gcc (GCC) 11.2.0, GNU ld (GNU Binutils)…...

【转载】OpenCV ECC图像对齐实现与代码演示(Python / C++源码)

发现一个有很多实践代码的git 库,特记录下: 地址:GitHub - luohenyueji/OpenCV-Practical-Exercise: OpenCV practical exercise 作者博客地址:https://blog.csdn.net/LuohenYJ 已关注。 Items项目Resources1age_gender1基于深度学习识别人脸性别和年龄Model2OpenCV_dlib_…...

每日一题(相交链表 )

欢迎大家来我们主页进行指导 LaNzikinh-CSDN博客 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节…...

C#WPF控件大全

本文列出WPF控件大全,点击可以进入详情页查看。 列表如下: AccessText用下划线来指定用作访问键的字符。 ActivatingKeyTipEventArgs为 ActivatingKeyTip 事件提供数据。...

好书推荐 《AIGC重塑金融》

作者&#xff1a;林建明 来源&#xff1a;IT 阅读排行榜 本文摘编自《AIGC 重塑金融&#xff1a;AI 大模型驱动的金融变革与实践》&#xff0c;机械工业出版社出版 这是最好的时代&#xff0c;也是最坏的时代。尽管大模型技术在金融领域具有巨大的应用潜力&#xff0c;但其应…...

【Linux】权限理解

权限理解 1. shell命令以及运行原理2. Linux权限的概念3. Linux权限管理3.1 文件访问者的分类&#xff08;人&#xff09;3.2 文件类型和访问权限&#xff08;事物属性&#xff09;3.2.1 文件类型3.2.2 基本权限 3.3 文件权限值的表示方法3.4 文件访问权限的相关设置方法3.4.1 …...

插入排序、归并排序、堆排序和快速排序的稳定性分析

插入排序、归并排序、堆排序和快速排序的稳定性分析 一、插入排序的稳定性二、归并排序的稳定性三、堆排序的稳定性四、快速排序的稳定性总结 在计算机科学中&#xff0c;排序是将一组数据按照特定顺序进行排列的过程。排序算法的效率和稳定性是评价其优劣的两个重要指标。稳定…...

【pytest、playwright】多账号同时操作

目录 方案实现思路&#xff1a; 方案一&#xff1a; 方案二&#xff1a; 方案实现思路&#xff1a; 依照上图所见&#xff0c;就知道&#xff0c;一个账号是pytest-playwright默认的环境&#xff0c;一个是 账号登录的环境 方案一&#xff1a; 直接上代码&#xff1a; imp…...

软考 系统架构设计师系列知识点之云原生架构设计理论与实践(8)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之云原生架构设计理论与实践&#xff08;7&#xff09; 所属章节&#xff1a; 第14章. 云原生架构设计理论与实践 第2节 云原生架构内涵 14.2 云原生架构内涵 关于云原生的定义有众多版本&#xff0c;对于云原生架构的…...

【C++】stack、queue和优先级队列

一、前言 二、stack类 2.1 了解stack 2.2 使用stack &#xff08;1&#xff09;empty &#xff08;2&#xff09;size &#xff08;3&#xff09;top &#xff08;4&#xff09;push &#xff08;5&#xff09;pop 2.3 stack的模拟实现 三、queue类 3.1 了解queue …...

第十三届蓝桥杯国赛真题 Java C 组【原卷】

文章目录 发现宝藏试题 A: 斐波那契与 7试题 B: 小蓝做实验试题 C: 取模试题 D: 内存空间试题 E \mathrm{E} E : 斐波那契数组试题 F: 最大公约数试题 G: 交通信号试题 I: 打折试题 J: 宝石收集 发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#x…...

docker部署ubuntu

仓库&#xff1a; https://hub.docker.com/search?qUbuntu 拉一个Ubuntu镜像 docker pull ubuntu:18.04 查看本地镜像&#xff1a; docker images 运行容器 docker run -itd --name ubuntu-18-001 ubuntu:18.04 通过ps命令可以查看正在运行的容器信息 docker ps 进入容器 最…...

现在网站尺寸/网站如何才能被百度收录

由于项目的需要&#xff0c;要判断手机里是否有sim卡。在网上找了一下资料结果发现&#xff0c;网上的资料很多都是一样的&#xff0c;都是判断sim卡的状态&#xff0c;把代码添加进去后发现不能满足需求。然后就自己看了一下文档。代码如下。/*** author CX-* 判断 是否含有si…...

名站在线/怎么设计网站

当我们的电脑使用一段时间之后&#xff0c;系统会以各式各样的方式留下种种使用痕迹&#xff0c;很多朋友或许只知道清除浏览器中的记录&#xff0c;其实电脑还会在很多文件夹和文档中留下我们的使用记录&#xff0c;小编这里为大家带来的就是关于如何彻底清除电脑使用痕迹的方…...

淘宝客网站如何做/微信小程序开发流程

什么是主键 主键(primary key)是表中的一个或多个字段&#xff0c;它的值用于唯一地标识表中的某一条记录。 所谓的复合主键 就是指你表的主键含有一个以上的字段组成。 如果表里没有可以当唯一主键&#xff0c;可以使用复合主键&#xff0c;确定一条记录的唯一性。 创建主键两…...

做rap的网站/优化设计答案大全

2014-03-06 Created By BaoXinjian 一、摘要 检查点将进程的当前读写位置存储在磁盘中用于恢复目的。 检查点不仅可以真实地标记 Extract进程捕获的要进行同步的数据变化以及 Replicat进程应用到 target数据库的数据变化&#xff0c;防止进程进行冗余的数据处理&#xff0c;还可…...

wordpress域名资源地址/保定百度首页优化

QStyle(5)&#xff1a;QStyle枚举综合 本文为原创文章&#xff0c;转载请注明出处&#xff0c;或注明转载自“黄邦勇帅(原名&#xff1a;黄勇) 本文出自本人原创著作《Qt5.10 GUI完全参考手册》网盘地址&#xff1a; https://pan.baidu.com/s/1iqagt4SEC8PUYx6t3ku39Q 《C语法…...

深圳网站制作/肇庆seo外包公司

2019独角兽企业重金招聘Python工程师标准>>> Netty实现安全Socket通信 SSL通信的原理请看&#xff1a;http://my.oschina.net/xinxingegeya/blog/266801 关于netty的编解码器请看&#xff1a;http://asialee.iteye.com/category/257110 netty的ssl通信其实就是在客户…...