最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

創(chuàng)建項目及包管理yarn create vite源碼學(xué)習(xí)

 更新時間:2022年09月27日 08:59:12   作者:小鑫同學(xué)  
這篇文章主要為大家介紹了創(chuàng)建項目及包管理yarn create vite源碼學(xué)習(xí)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1.引言

我們在編程學(xué)習(xí)的過程中也會寫一些項目的模板,這樣的模板在后期其實并沒有進行很好的管理,以至于下次再來回顧或使用的時候還需要從“零”開始,在使用過 Vite 來創(chuàng)建項目后順便拿看了一下倉庫中create-vite包中的源碼,得到了很好的啟發(fā)~

2.走進“yarn create vite”的源碼

2.1 Vite 創(chuàng)建項目的方式:

  • 終端交互方式創(chuàng)建項目;
  • 終端指定模版創(chuàng)建項目;

2.1.1 終端交互方式創(chuàng)建項目:

相比于以往的 CLI 工具提供的創(chuàng)建項目都需要優(yōu)先手動安裝 CLI 工具后再執(zhí)行對應(yīng)的創(chuàng)建命令,另一種就是 Vite 目前采用的直接通過包管理器內(nèi)置命令使用統(tǒng)一的規(guī)范來實現(xiàn)項目的快速創(chuàng)建;

如果你使用 YARN:

# yarn
yarn create vite

接下來就可以按終端提示進行項目名稱的錄入和項目模板的選擇了~

2.1.2 終端指定模版創(chuàng)建項目:

如果我們很明確內(nèi)置的模板選項的話我們可以在終端執(zhí)行時同時錄入項目名稱和模板名稱更快速的創(chuàng)建項目;

# yarn
yarn create vite my-vue-app --template vue

備注:使用“.”來在當(dāng)前目錄創(chuàng)建項目;

2.2 源碼分析:

  • 終端參數(shù)解析;
  • 交互收集數(shù)據(jù);
  • 目錄初始化;
  • 拷貝模板文件夾;
  • 重寫 gitignore 名稱;
  • 重寫 package 字段;
  • 后續(xù)操作提示;

2.2.1 終端參數(shù)解析:

通過 minimist 模塊將終端參數(shù)解析為對象形式:

const argv = minimist<{
  t?: string
  template?: string
}>(process.argv.slice(2), { string: ['_'] })

通過讀取對象屬性來得到 argTargetDir 和 argTemplate 兩個參數(shù):

const argTargetDir = formatTargetDir(argv._[0])
const argTemplate = argv.template || argv.t

2.2.2 交互收集數(shù)據(jù):

通過交互收集的數(shù)據(jù)包括:projectName、overwrite、packageName、framework、variant:

projectName:默認(rèn)值是 defaultTargetDir ,對應(yīng)的值是vite-project,當(dāng)通過終端解析到 argTargetDir 后將跳過此步驟;

{
  type: argTargetDir ? null : 'text',
  name: 'projectName',
  message: reset('Project name:'),
  initial: defaultTargetDir,
  onState: (state) => {
    targetDir = formatTargetDir(state.value) || defaultTargetDir
  }
}

overwrite:在確認(rèn)好 targetDir 參數(shù)后,我們要看 targetDir 對應(yīng)的文件夾是否存在或是文件夾中是否有文件,要提示用戶是否需要情況或終端操作;

{
  type: () =>
    !fs.existsSync(targetDir) || isEmpty(targetDir) ? null : 'confirm',
  name: 'overwrite',
  message: () =>
    (targetDir === '.'
      ? 'Current directory'
      : `Target directory "${targetDir}"`) +
    ` is not empty. Remove existing files and continue?`
},
{
  type: (_, { overwrite }: { overwrite?: boolean }) => {
    if (overwrite === false) {
      throw new Error(red('?') + ' Operation cancelled')
    }
    return null
  },
  name: 'overwriteChecker'
}

packageName:packageName 的值通過 路徑targetDir 來確定,在終端交互收集數(shù)據(jù)的時候需要對值做格式的校驗來確定合法性;

// 確定項目名稱
const getProjectName = () =>
    targetDir === '.' ? path.basename(path.resolve()) : targetDir
// 校驗項目名稱合法性
{
  type: () => (isValidPackageName(getProjectName()) ? null : 'text'),
  name: 'packageName',
  message: reset('Package name:'),
  initial: () => toValidPackageName(getProjectName()),
  validate: (dir) =>
    isValidPackageName(dir) || 'Invalid package.json name'
}

framework:如果終端已獲取到 argTemplate 參數(shù),且已內(nèi)置該模板將跳過這步,否則將進行預(yù)置模板配置的解析并選擇;

{
  type:
    argTemplate && TEMPLATES.includes(argTemplate) ? null : 'select',
  name: 'framework',
  message:
    typeof argTemplate === 'string' && !TEMPLATES.includes(argTemplate)
      ? reset(
          `"${argTemplate}" isn't a valid template. Please choose from below: `
        )
      : reset('Select a framework:'),
  initial: 0,
  choices: FRAMEWORKS.map((framework) => {
    const frameworkColor = framework.color
    return {
      title: frameworkColor(framework.display || framework.name),
      value: framework
    }
  })
}

variant:通過上一步得到的 framework 參數(shù)將確定這個步的配置,因為同樣的 framework 看一配置多種 variant ;

{
  type: (framework: Framework) =>
    framework && framework.variants ? 'select' : null,
  name: 'variant',
  message: reset('Select a variant:'),
  choices: (framework: Framework) =>
    framework.variants.map((variant) => {
      const variantColor = variant.color
      return {
        title: variantColor(variant.display || variant.name),
        value: variant.name
      }
    })
}

2.2.3 目錄初始化:

目錄如果不存在的話我們需要創(chuàng)建對應(yīng)的目錄,因為在前期收集參數(shù)可能是個目錄,這兒創(chuàng)建的時候需要遞歸創(chuàng)建,但是當(dāng)目錄存在且有內(nèi)容的時候我們就需要清空掉里面的文件了,但是在清空的時候我們要考慮當(dāng)時目錄可能已經(jīng)被版本管理過了,所以需要對.git目錄過濾掉,這樣才更完整;

const root = path.join(cwd, targetDir)
if (overwrite) {
  emptyDir(root)
} else if (!fs.existsSync(root)) {
  fs.mkdirSync(root, { recursive: true })
}

2.2.4 拷貝模板文件夾:

模板拷貝的時候需要過濾掉package.json,我們會在后面單獨進行處理;

const files = fs.readdirSync(templateDir)
for (const file of files.filter((f) => f !== 'package.json')) {
  write(file)
}

2.2.5 重寫 gitignore 名稱:

在上一步的模板文件夾拷貝的時候已經(jīng)用到了這個函數(shù),我們這里關(guān)系第二行中的關(guān)鍵對象 renameFiles ,實際上就是要將 _gitignore 重命名為 .gitignore ,因為在模板中直接使用 .gitignore 可能就導(dǎo)致關(guān)節(jié)的文件被丟失掉了;

const write = (file: string, content?: string) => {
  const targetPath = path.join(root, renameFiles[file] ?? file)
  if (content) {
    fs.writeFileSync(targetPath, content)
  } else {
    copy(path.join(templateDir, file), targetPath)
  }
}

2.2.6 重寫 package 字段:

最后來輸出 package.json ,需要改變里面的內(nèi)容,尤其是重要的項目名稱,命名規(guī)范也是為了符合 package 中 name 的規(guī)則;

const pkg = JSON.parse(
  fs.readFileSync(path.join(templateDir, `package.json`), 'utf-8')
)
pkg.name = packageName || getProjectName()
write('package.json', JSON.stringify(pkg, null, 2))

2.2.7 后續(xù)操作提示:

在模板拷貝完畢后項目的創(chuàng)建階段也就結(jié)束了,接著就是判斷在終端執(zhí)行的包管理器來提示用戶下一步的操作了~

const pkgInfo = pkgFromUserAgent(process.env.npm_config_user_agent)
const pkgManager = pkgInfo ? pkgInfo.name : 'npm'
switch (pkgManager) {
  case 'yarn':
    console.log('  yarn')
    console.log('  yarn dev')
    break
  default:
    console.log(`  ${pkgManager} install`)
    console.log(`  ${pkgManager} run dev`)
    break
}

3. 總結(jié)

在源碼中還支持了第三方模板通過自定義命令來創(chuàng)建項目,關(guān)鍵詞可以搜索 customCommand ,整體源碼是很簡單的,你準(zhǔn)備好為自己創(chuàng)建一套模板管理工具了嗎~

以上就是創(chuàng)建項目及包管理yarn create vite源碼學(xué)習(xí)的詳細(xì)內(nèi)容,更多關(guān)于創(chuàng)建項目包管理yarn create vit的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決vue 使用setTimeout,離開當(dāng)前路由setTimeout未銷毀的問題

    解決vue 使用setTimeout,離開當(dāng)前路由setTimeout未銷毀的問題

    這篇文章主要介紹了解決vue 使用setTimeout,離開當(dāng)前路由setTimeout未銷毀的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Vue項目優(yōu)化打包之前端必備加分項

    Vue項目優(yōu)化打包之前端必備加分項

    相信現(xiàn)在很多人都是用Vue做過了各種項目,但是項目代碼做完和上線并不代表這結(jié)束,還有上線以后的優(yōu)化也是很重要的一點,這篇文章主要給大家介紹了關(guān)于Vue項目優(yōu)化打包的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • vue項目中用cdn優(yōu)化的方法

    vue項目中用cdn優(yōu)化的方法

    本篇文章主要介紹了vue項目中用cdn優(yōu)化的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • vue如何獲取圖片流數(shù)據(jù)并展示

    vue如何獲取圖片流數(shù)據(jù)并展示

    這篇文章主要介紹了vue如何獲取圖片流數(shù)據(jù)并展示問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Vue使用虛擬鍵盤及中英文切換功能

    Vue使用虛擬鍵盤及中英文切換功能

    這篇文章主要給大家介紹了關(guān)于Vue使用虛擬鍵盤及中英文切換的相關(guān)資料,有時候在大型觸屏設(shè)備(如雙屏設(shè)備)中往往就沒有鍵盤去操作,所以就需要去建立一個虛擬鍵盤去操作,需要的朋友可以參考下
    2023-06-06
  • 淺析Vue2/Vue3中響應(yīng)式的原理

    淺析Vue2/Vue3中響應(yīng)式的原理

    這篇文章主要是來和大家一起討論一下Vue2與Vue3中響應(yīng)式的原理,文中的相關(guān)示例代碼簡潔易懂,對我們深入了解Vue有一定的幫助,需要的可以參考下
    2023-07-07
  • vue3項目keepAlive使用方法詳解

    vue3項目keepAlive使用方法詳解

    keepalive是Vue的內(nèi)置組件,作用是將組件緩存在內(nèi)存當(dāng)中,防止重復(fù)渲染DOM,屬于消耗內(nèi)存獲取速度,這篇文章主要介紹了vue3項目keepAlive使用方法,主要將keepaliev在vue3.0中的用法,需要的朋友可以參考下
    2024-03-03
  • vue之子組件如何修改父組件的值

    vue之子組件如何修改父組件的值

    這篇文章主要介紹了vue之子組件如何修改父組件的值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 基于Vue實現(xiàn)文件拖拽上傳功能

    基于Vue實現(xiàn)文件拖拽上傳功能

    文件拖拽上傳功能現(xiàn)在已經(jīng)隨處可見,大家應(yīng)該都用過了吧,那么它具體是怎么實現(xiàn)的大家有去了解過嗎,今天我們一起來實現(xiàn)一下這個功能,并封裝一個拖拽上傳組件吧
    2024-03-03
  • Vue實現(xiàn)簡單網(wǎng)頁計算器

    Vue實現(xiàn)簡單網(wǎng)頁計算器

    這篇文章主要為大家詳細(xì)介紹了Vue實現(xiàn)簡單網(wǎng)頁計算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論

昭觉县| 孝义市| 从化市| 醴陵市| 曲麻莱县| 竹北市| 察隅县| 长丰县| 广饶县| 灵宝市| 白银市| 弥渡县| 丹寨县| 柳河县| 西青区| 苏州市| 阿坝| 长春市| 循化| 青河县| 那坡县| 广灵县| 普定县| 安仁县| 梅州市| 南部县| 敖汉旗| 思南县| 凉山| 舞阳县| 台东县| 关岭| 禹州市| 浦东新区| 永宁县| 贺州市| 拜城县| 老河口市| 仪征市| 太保市| 保定市|