⚡node打怪升级系列 - 脚手架和项目那千丝万缕的关系

前言

NodeJS这东西是不是学过了,之后感觉又像没学到什么东西???

我最近翻到了之前学习node的笔记,又结合了一些大佬的经验,这里把node系列相关的东西串联一下,分享给小伙伴们,顺便我自己也加深一下印象。

总共分为六篇

node打怪升级系列 - 基础篇

node打怪升级系列 - Koa篇

node打怪升级系列 - 浅谈require函数

node打怪升级系列 - 手写中间件篇

node打怪升级系列 - 手写发布订阅和观察者篇

node打怪升级系列 - 手写compose(洋葱模型)

node打怪升级系列 - 手写脚手架交互式命令界面

书接上文⚡node打怪升级系列 - 手写脚手架交互式命令界面

这里聊下 项目和构建分离 通过命令在项目中生成脚手架提供的模板

正文开始

项目和构建(脚手架)分离

1,为什么要项目和构建(脚手架)分离

独立性:项目开发人员专注项目开发,构建/脚手架开发人员专注于脚手架开发

安全性:不想让cli配置被别人乱改,就可以独立出去自己维护

2,核心思路

3,项目结构

cli/脚手架

项目demo

实现的效果

大白话解说:

  • 1, 在react-demo项目下运行cluo-cli pack

  • 2, 出现命令行交互界面

  • 3, 用户选择dev

  • 4, action触发,执行devRollup

  • 5, rollup获取react-demo项目index.jsx为入口并对其进行打包

  • 6, 输出dist目录到 react-demo项目

  • 7, 启动服务默认打开react-demo项目index.html

  • 8, 展示页面

4,命令行开发

可以看下⚡node打怪升级系列 - 手写脚手架交互式命令界面

5,rollup开发

bin/babel.config.js

js 复制代码
module.exports = {
    configFile: false, // 禁止读取 babel 的配置文件
    babelrc: false,
    presets: [
        require.resolve('@babel/preset-env'),
        require.resolve('@babel/preset-react')
    ]
}

bin/rollup.js

js 复制代码
const rollup = require('rollup');
const { devConfig } = require('./rollup.config');

async function devRollup(entry) {
  // 以 rollup.config.js 为打包配置,运行一下。
  const options = devConfig(entry);
  const bundle = await rollup.rollup(options);
  const { code, map } = await bundle.generate(options.output);
  await bundle.write(options.output);
}

module.exports = { devRollup };

bin/rollup.config.js

js 复制代码
const path = require('path');

const babel = require('rollup-plugin-babel');
const livereload = require('rollup-plugin-livereload');
const serve = require('rollup-plugin-serve');

const bableConfig = require('./babel.config');

function devConfig(entry = "index.jsx") {
  return {
    input: path.resolve(process.cwd(), entry), // process.cwd() 输入是目标项目的路径
    output: {
      file: path.resolve(process.cwd(), 'dist/bundle.js'), // process.cwd() 输出是目标项目的路径
      format: 'iife',
      globals: {
        "react": 'React',
        'react-dom': 'ReactDOM'
      }
    },
    external: [
      'react', 'react-dom'
    ],
    plugins: [
      babel(bableConfig),
      livereload(),
      serve({
        openPage: path.resolve(process.cwd(), 'index.html'),
        port: 3001,
        contentBase: './'
      })
    ]
  }
}

module.exports = {
  devConfig
}

这里和小伙伴们说下大功臣process.cwd()

process.cwd():在哪运行,就获得哪里的项目路径

react-demo是一个小demo,网上一堆就不提供啦

通过命令在项目中生成脚手架提供的模板

1,项目结构

bin/index.js

js 复制代码
const { Command, program } = require('commander');
const fse = require('fs-extra');
const path = require('path');

program
  .version('0.1.0')
  .description('this is a test')
  // 添加了一个子命令
  .command('create [project]') // 构建一个打包工具
  .description('这个命令可以创建模板')
  .action((project, type) => {
    console.log(`entry :${project}, type: ${JSON.stringify(type)}`)
    fse.copy(path.resolve(__dirname, '../template'), process.cwd(), (err) => {
      if (err) return console.log('Failed!');
    })
    console.log('success!')
  })
  
program.parse(process.argv);

原先的react-demo

输入$ cluo-cli create project1后的react-demo

这里和小伙伴们说下大功臣fse.copy

fse.copy('当前的模板路径', '目标模板路径')

是不是之前以为很难,现在感觉挺简单的了~~~

完结

这篇文章我尽力把我的笔记和想法放到这了,希望对小伙伴有帮助。

欢迎转载,但请注明来源。

最后,希望小伙伴们给我个免费的点赞,祝大家心想事成,平安喜乐。

相关推荐
天下无贼!4 分钟前
2024年最新版TypeScript学习笔记——泛型、接口、枚举、自定义类型等知识点
前端·javascript·vue.js·笔记·学习·typescript·html
小白小白从不日白41 分钟前
react 高阶组件
前端·javascript·react.js
Mingyueyixi1 小时前
Flutter Spacer引发的The ParentDataWidget Expanded(flex: 1) 惨案
前端·flutter
Rverdoser2 小时前
unocss 一直热更新打印[vite] hot updated: /__uno.css
前端·css
Bang邦2 小时前
使用nvm管理Node.js多版本
前端·node.js·node多版本管理
podoor2 小时前
wordpress不同网站 调用同一数据表
前端·wordpress
新知图书2 小时前
Node.js快速入门
node.js
LJ小番茄3 小时前
Vue 常见的几种通信方式(总结)
前端·javascript·vue.js·html
黑狼传说3 小时前
前端项目优化:极致最优 vs 相对最优 —— 深入探索与实践
前端·性能优化
장숙혜3 小时前
前端-CDN的理解及CDN一些使用平台
前端