首先這篇文章是讀 vue.js
源代碼的梳理性文章,文章分塊梳理,記錄着本身的一些理解及大體過程;更重要的一點是但願在 vue.js 3.0
發佈前深刻的瞭解其原理。html
若是你從未看過或者接觸過 vue.js
源代碼,建議你參考如下列出的 vue.js
解析的相關文章,由於這些文章更細緻的講解了這個工程,本文只是以一些 demo
演示某一功能點或 API
實現,力求簡要梳理過程。vue
若是搞清楚了工程目錄及入口,建議直接去看代碼,這樣比較高效 ( 遇到難以理解對應着回來看看別人的講解,加以理解便可 )node
文章所涉及到的代碼,基本都是縮減版,具體還請參閱 vue.js - 2.5.17。git
若有任何疏漏和錯誤之處歡迎指正、交流。github
上圖簡單介紹了整個 vue.js 的工程目錄,咱們關注的點:web
package.json
...
"scripts": {
"dev": "rollup -w -c scripts/config.js --environment TARGET:web-full-dev",
"dev:cjs": "rollup -w -c scripts/config.js --environment TARGET:web-runtime-cjs",
"dev:esm": "rollup -w -c scripts/config.js --environment TARGET:web-runtime-esm",
"dev:test": "karma start test/unit/karma.dev.config.js",
"dev:ssr": "rollup -w -c scripts/config.js --environment TARGET:web-server-renderer",
"dev:compiler": "rollup -w -c scripts/config.js --environment TARGET:web-compiler ",
"dev:weex": "rollup -w -c scripts/config.js --environment TARGET:weex-framework",
"dev:weex:factory": "rollup -w -c scripts/config.js --environment TARGET:weex-factory",
"dev:weex:compiler": "rollup -w -c scripts/config.js --environment TARGET:weex-compiler ",
"build": "node scripts/build.js",
"build:ssr": "npm run build -- web-runtime-cjs,web-server-renderer",
"build:weex": "npm run build -- weex",
"test": "npm run lint && flow check && npm run test:types && npm run test:cover && npm run
test:e2e -- --env phantomjs && npm run test:ssr && npm run test:weex",
"test:unit": "karma start test/unit/karma.unit.config.js",
},
...
複製代碼
就本地運行、斷點調試,咱們只需關注 」dev「
選項;簡單解釋一下,npm run dev
執行 scripts/config.js
目標爲 web-full-dev
npm
config.js
簡單介紹const builds = {
...
// Runtime+compiler development build (Browser)
'web-full-dev': {
entry: resolve('web/entry-runtime-with-compiler.js'),
dest: resolve('dist/vue.js'),
format: 'umd',
env: 'development',
alias: { he: './entity-decoder' },
banner
},
...
};
function genConfig(name) {
const opts = builds[name]; // 映射目標配置
const config = {
input: opts.entry,
external: opts.external,
plugins: [...].concat(opts.plugins || []),
output: {
file: opts.dest,
format: opts.format,
banner: opts.banner,
name: opts.moduleName || 'Vue'
},
sourceMap: true // 爲了更清晰調試代碼,建議你開啓
};
...
return config;
}
if (process.env.TARGET) {
module.exports = genConfig(process.env.TARGET);
}
...
複製代碼
在 genConfig - config
中添加 sourceMap: true
, 爲了可以在斷點調試時,把代碼映射到單文件內部。json
根據 package.json "dev"
映射知道了 web-full-dev
再由配置文件找到入口文件:entry: resolve('web/entry-runtime-with-compiler.js')
weex
"web"
別名配置 - alias.js
查看實際映射爲 web: resolve('src/platforms/web')
src/platforms/web/entry-runtime-with-compiler.js
安裝依賴: npm i | yarn
app
運行: npm run dev | yarn dev
dist
目錄下生成兩個文件 vue.js
vue.js.map
引入生成 vue.js
代碼, demo 以下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>vue.js DEMO</title>
<script src="dist/vue.js"></script>
</head>
<body>
<div id="app">
<p>{{ message }}</p>
</div>
<script> new Vue({ el: '#app', data: { message: 'hello vue.js' } }); </script>
</body>
</html>
複製代碼
承接下文 - 「試着讀讀 Vue 源代碼」初始化先後作了哪些事情 ❓