npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@tangjs/octopus

v2.2.1

Published

## 一、简介 🐙

Downloads

7

Readme

Octopus

一、简介 🐙

Octopus 是一个能够帮你快速实现模板创建工具的库,你只需要简单配置就可以完成一个 create-xxx 的 npm 包。

二、快速上手 🚀

Octopus 提供了几个核心 API,通过它们来完成你的 initializer。举一个例子,现在要实现一个创建 react 的 initializer 叫做 create-dnf,并让开发者只需使用 init 指令 npm init dnf 就可以创建想要的模板。

使用 Octopus,你可以这样做。

2.1 创建项目

这里先创建一个项目工程,并把你的模板 copy 到 local 目录,项目结构如下。

├── local                                     # 存放本地模板的目录
│   ├── react-template                        # react 模板
├── src
│   ├── index.js                              # 工程入口
├── package.json                              # package文件

下载 Octopus

npm i @tangjs/octopus -S

2.2 创建 Octopus

你需要在 index 创建 Octopus(注意是 ESM 语法规范)

#!/usr/bin/env node

import path from 'path';
import { createOctopus } from '@tangjs/octopus';

createOctopus({
  name: 'dnf', // 工具的名字
  banner: {
    type: 'text',
    value: 'DNF.js - This is a front-end framework called dnf~',
  },
  description: '这是一个叫做 DNF 的模板创建工具',
  version: '1.0.0',
  templatesDir: path.resolve(__dirname, './local'), // 模板目录
  templates: [
    // 模板配置
    {
      name: 'react-template', // 如果是本地模板,必须跟 local 下模板目录同名
      description: 'app demo template',
      type: 'local', // 模板类型
    },
  ],
});

2.3 测试

将 package.json 中的 bin 字段进行修改

  "bin": {
    "create-dnf": "bin/index.js"
  }

link 到全局

npm link

本地测试

npm init dnf app-demo

2.4 发布

想让所有人都能使用 npm init dnf,还有两个步骤需要完成。

I. 检测包名

必须检查包名是否被占用

II. 发布

在检测你的包名未被占用后,就可以使用 publish 命令发布

npm publish

三、API 📚

2.1 createOctopus(options)

用于创建 Octopus

options

  • name <string>: initializer 的名字
  • version <string>: 版本号
  • banner <BannerConfig>: banner 配置 【可选】
    • type <string>: text | block 【可选】
    • color <string>: 色值 【可选】
    • value <string>: banner 文字
  • description <string>: 描述信息
  • templatesDir <string>: 本地模板的绝对路径
  • templates <TemplateConfig>: 模板配置列表

2.2 defineTemplate(config)

用力定义模板配置信息,返回一个 <TemplateConfig> 对象

config

  • name <string>: 模板名字
  • description <string>: 模板描述,展示在模板选项中
  • type <string>: 'local' | 'git' | 'npm' 模板加载类型
  • path<string>: 当 type 配置为 git 或 npm 时,该参数必填,定义 Octopus 从哪个源地址下载模板
  • tips<Tips>: 相关阶段提示信息
    • startCreate<string>
    • creationCompleted<string>
    • finish<string[]>
  • gitOptions <Record<any, any>>: 当 type 为 git 时,配置的 git 参数,同 download-git-repo
  • onContextCreated <(context: CreatorConext) => any>: context 上下文创建时触发的钩子函数 【可选】
  • onBeforeEmit<(context: CreatorConext) => any>: 模板在输出到目标目录之前触发的钩子,可用于做一些前置操作【可选】
  • onAfterEmit?<(context: CreatorConext) => any>: 模板在输出到目标目录之后触发的钩子,可以对创建好的模板做一些操作【可选】

使用

除了可以将模板内置在 initializer 包里面,你还可以将模板发布到 npm 上,这样大家都可以通过 npm 下载你模板

import { defineTmeplate } from '@tangjs/octopus';

export default defineTmeplate({
  name: 'octopus',
  description: '下载 octopus npm 包',
  type: 'npm',
  path: '@tangjs/octopus', // 也可以指定某个版本,如 @tangjs/[email protected]
});

你也可以将你的模板维护在 github (gitlab 或其他 git 仓库)上,当然有时候会存在一些权限问题

import { defineTmeplate } from '@tangjs/octopus';
import inquirer from 'inquirer';
import path from 'path';

export default defineTmeplate({
  name: 'react-template',
  description: 'react-template',
  path: 'zixingtangmouren/react-template',
  type: 'git',
  onBeforeEmit: async (ctx) => {
    // 在项目输出到本地之前,询问项目的名称
    const { name } = await inquirer.prompt({
      type: 'input',
      name: 'name',
      message: '输入项目的名字',
    });

    // 将用户输入的名称,存入上下文中
    ctx.name = name;
  },
  onAfterEmit: async (ctx) => {
    const { name, dirPath, modifyFileContent } = ctx;

    // 根据用户输入,修改文件内容
    return await modifyFileContent(path.resolve(dirPath, 'package.json'), (content) => {
      return content.replace('react-template', name);
    });
  },
});