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 🙏

© 2025 – Pkg Stats / Ryan Hefner

@surveyking/my-component

v1.0.2

Published

Webpack 的配置文件主要做了如下事情:

Readme

如何发布 npm 包

Webpack 的配置文件主要做了如下事情:

  • 使用 example/src/index.js作为项目入口,处理资源文件的依赖关系
  • 通过 babel-loader来编译处理 js和jsx文件
  • 通过style-loader 和 css-loader来处理 css 依赖和注入内联样式
  • 通过html-webpack-plugin自动注入编译打包好的脚本文件
  • 为 demo 启动端口为 3001 的服务

后需要指定 Babel 需要对哪些文件进行编译,毫无疑问 React 中使用的 JSX 文件需要被编译,让它转换成被主流浏览器都支持的 ES5 ,通用的配置也很简单,只需要添加一对 presets,在项目根目录下添加文件.babelrc

{
 "presets": ["env", "react"]
}

发布到 npm 是一个很简单自动化的工作,只是在发布前需要做如下工作

我们要发布被 babel 编译且被压缩后的版本,要让没有使用 babel 的项目也能够正常的使用,比如不能出现 JSX 语法

首先需要安装 babel cli

npm i babel-cli -D

现在我们添加 transpile脚本,以便使用 Babel 编译我们的源代码,同时拷贝一些静态文件(如:css 文件)到目标打包目录dist下

同时指定被编译后的版本为组件的主入口,更改后的 package.json

npm run transpile

现在在我们项目根目录下面会有一个 dist 目录,包含了 index.js 的编译版本,和拷贝的样式文件styles.css,这些文件是用户可以直接 可以import到他们项目的文件,接下来我们再在我们的工作流中添加一个脚本prepublishOnly ,这个脚本会在每次我们需要发布我们的组件到 npm上去的时候会自动执行,他能确保我们每次发布上去的代码都是最新代码编译的

另外我们需要告诉用户在用户我们的组件的时候对于 React 版本的要求,peerDependency 能够很好的表达这个信息,同时在我们的发布的组件包中不会包含 react , 这样也减小了包的大小,更加重要是可以避免在用户的项目中存在多个 react 版本,更改后的 package.json如下

最后让我们在项目的根目录下添加.npmignore文件,告诉 npm,我们项目中哪些文件和文件夹是在发布的包中被忽略掉的

# .npmignore 
src
examples
.babelrc
.gitignore
webpack.config.js

dependencies 区别

  • devDependecies 蛀牙放置本地开发过程需要使用到的编译、打包、测试、格式化模块,安装依赖的时候,不会安装依赖的 devDependencies 运行时用不到的依赖,放在 devDependencies 中
  • dependencies 项目中实际运行需要用到的代码,没有的话会出错,安装依赖的时候会
  • peerDependencies 同级依赖,用在发布的代码库当中,表示需要宿主环境提供该配置下的模块依赖,与宿主环境息息相关。npm(3.x 版本之后,7.x 之前)、yarn 不会自动安装该配置下的依赖模块,会告警提示。要求运行时时单例的依赖(vue、react 等同时只能存在一个实例)使用 peerDependencies
// faker-project
{
  "name": "faker-project",
  "dependencies": {
    "sdk-a": "1.0.0"
  }
}
// sdk-a
{
  "name": "sdk-a",
  "version":"1.0.0",
  "dependencies": {
    "sdk-core": "0.0.1"
  }
}

faker project 执行
|
├── node_modules  
|  ├── sdk-a
|  └── sdk-core
|
└── package.json

假设现在有一个 helloWorld 工程,已经在其 package.json 的 dependencies 中声明了 packageA,有两个插件 plugin1 和 plugin2 他们也依赖 packageA,如果在插件中使用 dependencies 而不是 peerDependencies 来声明 packageA,那么 $ npm install 安装完 plugin1 和 plugin2 之后的依赖图是这样的:

.
├── helloWorld
│   └── node_modules
│       ├── packageA
│       ├── plugin1
│       │   └── nodule_modules
│       │       └── packageA
│       └── plugin2
│       │   └── nodule_modules
│       │       └── packageA

peerDependency 就可以避免类似的核心依赖库被重复下载的问题。

  • 如果用户显式依赖了核心库,则可以忽略各插件的 peerDependency 声明;
  • 如果用户没有显式依赖核心库,则按照插件 peerDependencies 中声明的版本将库安装到项目根目录中;

npm的扁平化安装

你想要在使用你的插件的时候自动安装的,就用dependencies,一般都是构建后会用到的包,peerDependencies是没有显式依赖的,不会影响你的插件构建,你希望用户项目内有,但是不会自动下载的 如果你使用peerDependencies,但是构建会报错,说明你的项目用到了那个包,并且构建时依赖了,一般插件都不会把npm的依赖打包进去,因为如果你直接打包进去了,那么会导致例如vue和corejs代码在项目内存在多个 一般看你的插件打包配置是否正确,就看比如vue和corejs等npm包代码在dist代码里是require或import的,还是直接把代码打包进去了,应该都是require和import的才对

参考

从0开始发布一个 react 组件到 npm