vue2.7.16源码 - Vue项目入口和打包核心代码分析

打包命令

css 复制代码
scripts:{
     "build": "node scripts/build.js",
}

scripts/build.js

  • 实际运行的打包命令,通过rollup实现

    javascript 复制代码
      const rollup = require('rollup')
      // 读取配置代码,开始构建代码
      let builds = require('./config').getAllBuilds()
    
      build(builds)
    
      function build (builds) {
        let built = 0
        const total = builds.length
        const next = () => {
          buildEntry(builds[built]).then(() => {
            built++
            if (built < total) {
              next()
            }
          }).catch(logError)
        }
        next()
      }
    
      }
    
      function buildEntry (config) {
        const output = config.output
        const { file, banner } = output
        const isProd = /(min|prod).js$/.test(file)
        return rollup.rollup(config)
          .then(bundle => bundle.generate(output))
          .then(async ({ output: [{ code }] }) => {
            if (isProd) {
              const {code: minifiedCode} =  await terser.minify(code, {
                toplevel: true,
                compress: {
                  pure_funcs: ['makeMap'],
                },
                format: {
                  ascii_only: true,
                }
              });
              const minified = (banner ? banner + '\n' : '') + minifiedCode
              return write(file, minified, true)
            } else {
              return write(file, code)
            }
          })
      }

scripts/config.js

  • 配置打包输出和输入路径

scripts/alias.js

  • 指定vue目标文件,web和sfc等目标文件

    less 复制代码
      const path = require('path')
    
      const resolve = p => path.resolve(__dirname, '../', p)
    
      module.exports = {
        vue: resolve('src/platforms/web/entry-runtime-with-compiler'),
        compiler: resolve('src/compiler'),
        core: resolve('src/core'),
        shared: resolve('src/shared'),
        web: resolve('src/platforms/web'),
        server: resolve('packages/server-renderer/src'),
        sfc: resolve('packages/compiler-sfc/src')
      }

src/platforms/web/entry-runtime-with-compiler.ts

  • vue对外暴露的入口文件,核心vue构造函数

引用过程(渐进增强)

  • entry-runtime-with-compiler
    • vue暴露的最外层核心类
    • 插入composition Api
    • watcher构建
  • src/platforms/web/runtime-with-compiler.ts
    • 增加render构建执行,触发mounted
  • src/platforms/web/runtime/index.ts
    • 注入components和$mount
  • src/core/index.ts
    • 注入静态属性和预置生命周期
相关推荐
bugcome_com10 小时前
JWT 知识小课堂:从入门到精通,一文吃透 JSON Web Token
前端·json
To_OC10 小时前
写了三天 Next.js,我的 React 世界观被拆了又装回去
前端·全栈·next.js
独泪了无痕10 小时前
viewer.js 安装与配置指南:实现图片预览功能
前端·vue.js
Fluxart.ai12 小时前
电商商品图审核怎么自动化?规则引擎、人工复核与发布门禁
java·前端·自动化
why技术12 小时前
AI 写的文章,可能都带着手敲一遍都去不掉的“隐形水印”。
前端·人工智能·后端
愚公搬代码13 小时前
【愚公系列】《Android应用案例开发大全》016-LBS类应用掌上杭州(辅助工具类的开发)
android·前端
CodeSheep13 小时前
又一个华为天才少年,离职了!
前端·后端·程序员
kyriewen13 小时前
面试官说"打开你的AI工具"——我才发现,他考的根本不是写代码
前端·人工智能·面试
IT_陈寒14 小时前
Vue的双向绑定把我坑惨了,原来这个场景不能用
前端·人工智能·后端
hunterandroid15 小时前
[Android 从零到一] Compose LazyColumn 性能优化:key、稳定性与重组治理
android·前端