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

happy-dev-server

v1.4.0-beta.0

Published

无需配置就能能导入 js、css、image 等文件的静态服务器

Downloads

72

Readme

happy-dev-server

无需配置就能导入 js、css、image 等文件的静态服务器。

目前支持的功能有:

  • 支持命令行,支持根目录配置文件 happy.config.js
  • 支持 https、http2 协议,支持代理,支持自定义请求,支持监听文件改动自动刷新浏览器。
  • 支持 import {} from '@/index' -> import {} from '/src/index' 路径别名。
  • js、ts、json、vue、jsx、tsx 文件引入扩展名省略,如 import {} from './src/index
  • 支持导入 js、css、图片、json、ts、less、scss、vue、jsx、tsx 文件。
  • 支持 html 注入环境变量,如 <script src="<%= static %>index.js"></script>

使用

npm i happy-dev-server -g

命令行调用

// 项目的根目录下
happy-dev-server -w

-w 为监听根目录下的文件变化,从而通知浏览器刷新

命令行调用的情况下根目录应有一个 public 文件夹用于存放静态资源(examples文件夹有详细示例)。

root
|---> public
|       |---> index.html
|
|---> src
        |---> index.js、.ts、.css、...、.vue

api 调用

import HappyDevServer from 'happy-dev-server'

new HappyDevServer({
    watch: true
}).start()

配置参数

api配置参数

watch

可选值: true | false 默认值: false

是否开启监听模式,为 true 时开启监听模式,监听文件变动从而刷新浏览器。

port

可选值: number 默认值: 1234

指定监听的端口。

static

可选值: string 默认值: /static/

指定服务器托管静态资源的路径。

contentBase

可选值: string 默认值: rootPath + '/public'

指定服务器要托管的静态资源目录。

https

可选值: true | false | https 默认值: false

是否开启 https 服务,为 true 时或者指定 https 证书路径则开启 https 服务。

http2

可选值: true | false 默认值: false

是否开启 http2 服务,为 true 时则开启 http2 服务。

setup

可选值: (app: Express) => void 默认值: undefined

获取 Express 实例,可以劫持请求做一些数据模拟等。

extensions

可选值: Extensions 默认值: ['.js', '.ts', '.vue', '.jsx', '.tsx', '.json']

文件后缀省略配置项,若 happy-dev-server 找不到对应路径的文件时会尝试拼接后缀继续查找。

alias

可选值: Alias 默认值: { '@': 'src' }

路径前缀别名,若路径前缀能匹配上则会替换为对应值。

proxy

可选值: { [path: string]: ProxyOptions } 默认值: {}

代理配置,其中 ProxyOptions 为第三方库 http-proxy-middlewareOptions 配置项。

type https = {
    key: Buffer
    cert: Buffer
}

interface ServerOptions {
    port?: number
    https?: https | boolean
    http2?: boolean
    static?: string
    contentBase?: string
}

interface Alias {
    [k: string]: string
}

type Extensions = string[]

export interface HappyDevServerOptions extends ServerOptions {
    watch?: boolean
    setup?: (app: Express) => void
    extensions?: Extensions
    alias?: Alias
    proxy?: { [path: string]: ProxyOptions }
}


const defaultOptions: Required<HappyDevServerOptions> = {
    port: 1234,
    https: false,
    http2: false,
    static: '/static/',
    contentBase: rootPath + '/public',
    watch: false,
    setup: undefined,
    extensions: ['.js', '.ts', '.vue', '.jsx', '.tsx', '.json'],
    alias: { '@': 'src' },
    proxy: {}
}

命令行配置参数

happy-dev-server -w -p 8000 -hs key+5-key.pem cert+5.pem

Usage: happy-dev-server [options]

Options:
  -v, --version               output the version number
  -c, --config [filename]     指定配置文件 (default: "happy.config.js")
  -w, --watch                 监听文件变动,从而刷新浏览器
  -p, --port <number>         指定端口号
  -s, --static <path>         指定静态目录存放路径
  -hs, --https [filePath...]  指定开启https协议,需提供 key 和 cert 路径,若不提供参数则会自动生成自签名证书
  -h2, --http2                指定开启http2协议
  -h, --help                  display help for command

功能

往 html 注入环境变量

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <div id="box"></div>
    <img id="test" alt="">
    <!-- <%= static %> 为配置参数中的 static 值 -->
    <script type="module" src="<%= static %>index.js">
</body>

</html>

劫持除 public 文件夹外的文件,使之可以加载 css、image 等文件

// root/src/index.js
import './index.css'
import image from './image.png'

console.log(image) // this base64

还可以加载第三方模块

npm i vue element-plus -S
//////////////////////////////////
// root/src/index.js
import { createApp } from 'vue'
import Elm from 'element-plus'
import 'element-plus/dist/index.css'

原理

happy-dev-server 通过拦截请求处理各类文件,统一返回 javascript 格式。

对于第三方模块的加载 happy-dev-server 会查找 package.json 中的 dependencies,并对其进行打包,通过改写 import 中的地址来完成加载。

happy-dev-server 只拦截通过 script 引入的文件,对于诸如 linkimg srciframecss @import 等方式的引入将原封不动地返回文件内容。

例如:

/**
 * 加载 root/src/index.js, 解析到以下语法
 */
import Elm from 'element-plus'

// 识别为第三方模块,打包到 node_modules/.happy-dev-server 目录下,并改写 import 语句

// --->
import Elm from '/node_modules/.happy-dev-server/element-plus{version}.js'

对于第三方模块静态文件的支持,直接改写路径到对应的静态文件目录

import 'element-plus/dist/index.css'

// --->
import '/node_modules/element-plus/dist/index.css'