源码vue-cli-dev

Posted 看见了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了源码vue-cli-dev相关的知识,希望对你有一定的参考价值。

前言

学习vue-cli@3.0这个脚手架源码,希望达到以下目的:

  • 了解vue-cli的原理与机制
  • 学会编写命令行工具以及相关常用的npm包
  • 学会如何发布npm

准备

  • vue-cli

将GitHub上的仓库fork一份,再clone下来

@vue/babel-preset-app

这是所有Vue CLI项目中使用的默认Babel预设。(你可以简单认为是一系列 babel 的plugin组合)
  • babel.config.js
module.exports = {
  presets: [
    \'@vue/cli-plugin-babel/preset\'
  ]
}

这里的@vue/cli-plugin-babel/preset入口就是@vue/babel-preset-app这个包。

入口index.js

// code snippet
module.exports = (context, options = {}) => {
  return {
    sourceType: "unambiguous", // 判断文件中是否出现了import/export,来决定采用的模块化标准
    overrides: [
      {
        exclude: [/@babel[/|\\\\\\\\]runtime/, /core-js/],
        presets,
        plugins,
      },
      {
        // there are some untranspiled code in @babel/runtime
        // https://github.com/babel/babel/issues/9903
        include: [/@babel[/|\\\\\\\\]runtime/],
        presets: [[require("@babel/preset-env"), envOptions]],
      },
    ],
  };
};

主要看overrides中第一个 option 对象。pluginspresets的执行顺序是plugins优先,所以先从plugins开始。

const plugins = [];
plugins.push([
  require("./polyfillsPlugin"),
  { polyfills, entryFiles, useAbsolutePath: !!absoluteRuntime },
]);

// 测试环境这里直接忽略
if (process.env.VUE_CLI_BABEL_TRANSPILE_MODULES) {
  envOptions.modules = "commonjs";
  if (process.env.VUE_CLI_BABEL_TARGET_NODE) {
    // necessary for dynamic import to work in tests
    plugins.push(require("babel-plugin-dynamic-import-node"));
  }
}

plugins.push(
  require("@babel/plugin-syntax-dynamic-import"),
  [
    require("@babel/plugin-proposal-decorators"),
    {
      decoratorsBeforeExport,
      legacy: decoratorsLegacy !== false,
    },
  ],
  [require("@babel/plugin-proposal-class-properties"), { loose }]
);

plugins.push([
  require("@babel/plugin-transform-runtime"),
  {
    regenerator: useBuiltIns !== "usage",

    // polyfills are injected by preset-env & polyfillsPlugin, so no need to add them again
    corejs: false,

    helpers: useBuiltIns === "usage",
    useESModules: !process.env.VUE_CLI_BABEL_TRANSPILE_MODULES,

    absoluteRuntime,

    version,
  },
]);

按照babel插件执行顺序,第一个是polyfillsPlugin.js.

// add polyfill imports to the first file encountered.
module.exports = (
  { types },
  { polyfills, entryFiles = [], useAbsolutePath }
) => {
  return {
    name: \'vue-cli-inject-polyfills\',
    visitor: {
      Program (path, state) {
        if (!entryFiles.includes(state.filename)) {
          return
        }

        // imports are injected in reverse order
        polyfills
          .slice()
          .reverse()
          .forEach(p => {
            createImport(path, p, useAbsolutePath)
          })
      }
    }
  }
}

@vue/cli-overlay

定制覆盖Client

在TODO列表中,还没实现

@vue/cli-plugin-babel

@vue/cli-plugin-webpack-4

以上是关于源码vue-cli-dev的主要内容,如果未能解决你的问题,请参考以下文章

C# 获得目录创建时间的源码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

初识Spring源码 -- doResolveDependency | findAutowireCandidates | @Order@Priority调用排序 | @Autowired注入(代码片段

Android 插件化VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )(代码片段

Android 事件分发事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )(代码片段

Android 逆向整体加固脱壳 ( DEX 优化流程分析 | DexPrepare.cpp 中 dvmOptimizeDexFile() 方法分析 | /bin/dexopt 源码分析 )(代码片段