如果您使用的是 BSD-2-Clause 或 MIT 等通用许可证,请为您使用的许可证添加当前的SPDX
?许可证标识符,如下所示:
{
??"license"?:?"BSD-3-Clause"
}
您可以查看SPDX 许可证 ID 的完整列表。理想情况下,您应该选择 OSI批准的一种。
如果您的软件包在多个通用许可下获得许可,请使用SPDX 许可表达式语法版本 2.0 string,如下所示:
{
??"license"?:?"(ISC?OR?GPL-3.0)"
}
如果您使用的许可证尚未分配SPDX
?标识符,或者您使用的是自定义许可证,请使用如下字符串值:
{
??"license"?:?"SEE?LICENSE?IN?<filename>"
}
然后包含一个<filename>
在包的顶层命名的文件。
一些旧包使用许可证对象或包含许可证对象数组的“许可证”属性:
//?无效的元数据
{
??"license"?:?{
????"type"?:?"ISC",
????"url"?:?"https://opensource.org/licenses/ISC"
??}
}
//?无效的元数据
{
??"licenses"?:?[
????{
??????"type":?"MIT",
??????"url":?"https://www.opensource.org/licenses/mit-license.php"
????},
????{
??????"type":?"Apache-2.0",
??????"url":?"https://opensource.org/licenses/apache2.0.php"
????}
??]
}
这些样式现在已被弃用。相反,使用SPDX
表达式,如下所示:
{
??"license":?"ISC"
}
{
??"license":?"(MIT?OR?Apache-2.0)"
}
最后,如果您不希望根据任何条款授予他人使用私有或未发布包的权利:
{
??"license":?"UNLICENSED"
}
还要考虑设置"private": true
以防止意外发布。
author, contributors(作者和贡献者)
“作者”是一个人。“贡献者”是一群人。“person”是一个带有“name”字段和可选的“url”和“email”的对象,像这样:
{
??"name"?:?"Barney?Rubble",
??"email"?:?"b@rubble.com",
??"url"?:?"http://barnyrubble.tumblr.com/"
}
或者,您可以将其全部缩短为一个字符串,然后 npm 将为您解析它:
{
??"author":?"Barney?Rubble?<b@rubble.com>?(http://barnyrubble.tumblr.com/)"
}
email 和 url 都是可选的。
npm 还使用您的 npm 用户信息设置顶级“维护者”字段。
funding(档案)
可选files
字段是一个文件模式数组,它描述了当您的包作为依赖项安装时要包含的条目。文件模式遵循与 类似的语法.gitignore
,但相反:包含文件、目录或 glob 模式(*
,**/*
等)将使该文件在打包时包含在 tarball 中。省略该字段将使其默认为["*"]
,这意味着它将包含所有文件。
一些特殊的文件和目录也会被包含或排除,无论它们是否存在于files
数组中(见下文)。
您还可以.npmignore
在包的根目录或子目录中提供一个文件,以防止文件被包含在内。在包的根目录中,它不会覆盖“文件”字段,但在子目录中会覆盖。该.npmignore
文件就像一个.gitignore
. 如果有一个.gitignore
文件,并且.npmignore
丢失了,.gitignore
则将使用 的内容。
文件包含了“的package.json#文件”栏中_无法_通过排除.npmignore
或.gitignore
。
无论设置如何,始终包含某些文件:
-
package.json
-
README
-
CHANGES
/?CHANGELOG
/HISTORY
-
LICENSE
?/?LICENCE
-
NOTICE
- “主要”字段中的文件
README
,?CHANGES
,?LICENSE
&NOTICE
可以有任何大小写和扩展名。
相反,一些文件总是被忽略:
-
.git
-
CVS
-
.svn
-
.hg
-
.lock-wscript
-
.wafpickle-N
-
.*.swp
-
.DS_Store
-
._*
-
npm-debug.log
-
.npmrc
-
node_modules
-
config.gypi
-
*.orig
package-lock.json
(?npm-shrinkwrap.json
如果您希望发布,请使用)
main(主要入口)
-
main
?字段是?package.json
?中的另一种元数据功能,它可以用来指定加载的入口文件。假如你的项目是一个?npm
?包,当用户安装你的包后,require('my-module')
?返回的是?main
?字段中所列出文件的?module.exports
?属性。 - 当不指定
main
?字段时,默认值是模块根目录下面的index.js
?文件。
browser(浏览器)
如果您的模块打算在客户端使用,则应使用浏览器字段而不是主字段。这有助于提示用户它可能依赖于 Node.js 模块中不可用的原语。(例如?window
)
bin(自定义命令)
很多包都有一个或多个他们想要安装到 PATH 中的可执行文件。npm 使这变得非常简单(实际上,它使用此功能来安装“npm”可执行文件。)
要使用它,请bin
在 package.json 中提供一个字段,它是命令名到本地文件名的映射。在安装时,npm 会将该文件符号链接到prefix/bin
全局安装或./node_modules/.bin/
本地安装。
给大家看看我自己做一个简单的demo:
{
??"name":?"react-cli-library",
??"version":?"0.0.2",
??"description":?"",
??"bin":?{
????"react-cli":?"./bin/index.js"
??},
}
我的名称叫做react-cli-library。
所以,npm i react-cli-library
安装完成之后,执行react-cli就会有一些命令,他会执行我的根目录底下./bin/index.js
这个文件。
虽然我的项目名称是:react-cli-library
。但是我执行的内容却是react-cli
,这个取决于bin的内容
man(快捷入口)
用来给Linux下的man命令查找文档地址,是个单一文件或者文件数组。如果是单一文件,安装完成后,他就是man + 的结果,和此文件名无关,例如:
{
"name": "foo",
"version": "1.2.3",
"description": "A packaged foo fooer for fooing foos",
"main": "foo.js",
"man": "./man/doc.1"
}
通过man foo命令会得到 ./man/doc.1 文件的内容。如果man文件名称不是以模块名称开头的,安装的时候会给加上模块名称前缀。因此,下面这段配置:
{
"name": "foo",
"version": "1.2.3",
"description": "A packaged foo fooer for fooing foos",
"main": "foo.js",
"man": [
"./man/foo.1",
"./man/bar.1"
]
}
会创建一些文件来作为man foo和man foo-bar命令的结果。man文件必须以数字结尾,或者如果被压缩了,以.gz结尾。数字表示文件将被安装到man的哪个部分。
{
"name": "foo",
"version": "1.2.3",
"description": "A packaged foo fooer for fooing foos",
"main": "foo.js",
"man": [
"./man/foo.1",
"./man/foo.2"
]
}
会创建 man foo 和 man 2 foo 两条命令。
directories(目录)
CommonJS Packages规范详细说明了一些可以使用directories
对象指示包结构的方法。如果您查看npm 的 package.json,您会看到它包含 doc、lib 和 man 目录。
将来,这些信息可能会以其他创造性的方式使用。
目录.bin
如果在 中指定bin
目录directories.bin
,则将添加该文件夹中的所有文件。
由于bin
指令的工作方式,同时指定bin
路径和设置directories.bin
是错误的。如果要指定单个文件,请使用bin
,对于现有bin
?目录中的所有文件,请使用directories.bin
。
目录.man
一个充满手册页的文件夹。Sugar 通过遍历文件夹来生成“man”数组。
repository(代码存储位置)
指定代码所在的位置。这对想要贡献的人很有帮助。如果 git repo 在 GitHub 上,那么该npm docs
?命令将能够找到您。
像这样做:
{
??"repository":?{
????"type":?"git",
????"url":?"https://github.com/npm/cli.git"
??}
}
URL 应该是一个公开可用的(可能是只读的)url,可以直接传递给 VCS 程序,无需任何修改。它不应该是您放入浏览器的 html 项目页面的 url。是给电脑用的。
对于 GitHub、GitHub gist、Bitbucket 或 GitLab 存储库,您可以使用与 相同的快捷语法npm install
:
{
??"repository":?"npm/npm",
??"repository":?"github:user/repo",
??"repository":?"gist:11081aaa281",
??"repository":?"bitbucket:user/repo",
??"repository":?"gitlab:user/repo"
}
如果package.json
您的包的 不在根目录中(例如,如果它是 monorepo 的一部分),您可以指定它所在的目录:
{
??"repository":?{
????"type":?"git",
????"url":?"https://github.com/facebook/react.git",
????"directory":?"packages/react-dom"
??}
}
config(配置内容)
“config”对象可用于设置在升级过程中持续存在的包脚本中使用的配置参数。例如,如果一个包具有以下内容:
{
??"name":?"foo",
??"config":?{
????"port":?"8080"
??}
}
然后有一个“开始”命令,然后引用?npm_package_config_port
环境变量,然后用户可以通过执行npm config set foo:port 8001
.
查看config
和scripts
了解更多关于包配置的信息。
peerDependencies(对等依赖)
在某些情况下,您希望表达您的包与主机工具或库的兼容性,而不必执行require
此主机的操作。这通常称为插件。值得注意的是,您的模块可能会公开主机文档所预期和指定的特定接口。
例如:
{
??"name":?"tea-latte",
??"version":?"1.3.5",
??"peerDependencies":?{
????"tea":?"2.x"
??}
}
这确保您的软件包tea-latte
只能与主机软件包的第二个主要版本_一起_安装tea
。npm install tea-latte
可能会产生以下依赖图:
├──?tea-latte@1.3.5
└──?tea@2.2.0
在 npm 版本 3 到 6 中,peerDependencies
不会自动安装,如果在树中发现对等依赖项的无效版本,则会发出警告。由于NPM V7的,peerDependencies被?默认安装。
如果无法正确解析树,尝试安装具有冲突要求的另一个插件可能会导致错误。因此,请确保您的插件要求尽可能广泛,而不是将其锁定为特定的补丁版本。
假设主机符合semver,只有主机包的主要版本中的更改才会破坏您的插件。因此,如果您使用过主机包的每个 1.x 版本,请使用"^1.0"
或"1.x"
?来表达这一点。如果您依赖 1.5.2 中引入的功能,请使用?"^1.5.2"
.
peerDependenciesMeta(捆绑依赖)
这定义了在发布包时将捆绑的包名称数组。
如果您需要在本地保留 npm 包或通过单个文件下载使它们可用,您可以通过在bundledDependencies
?数组中指定包名称并执行npm pack
.
例如:
如果我们像这样定义 package.json:
{
??"name":?"awesome-web-framework",
??"version":?"1.0.0",
??"bundledDependencies":?[
????"renderized",
????"super-streams"
??]
}
我们可以awesome-web-framework-1.0.0.tgz
通过运行获取文件npm pack
。此文件包含的依赖关系renderized
,并super-streams
可以通过执行安装在一个新的项目npm install awesome-web-framework-1.0.0.tgz
。请注意,包名称不包含任何版本,因为该信息在dependencies
.
如果这是拼写"bundleDependencies"
,那么这也很荣幸。
optionalDependencies(可选依赖项)
如果可以使用依赖项,但如果找不到或安装失败,您希望 npm 继续,那么您可以将其放入?optionalDependencies
对象中。这是包名称到版本或 url 的映射,就像dependencies
对象一样。不同之处在于构建失败不会导致安装失败。运行npm install --no-optional
将阻止安装这些依赖项。
处理缺少依赖项仍然是您的程序的责任。例如,这样的事情:
try?{
??var?foo?=?require('foo')
??var?fooVersion?=?require('foo/package.json').version
}?catch?(er)?{
??foo?=?null
}
if?(?notGoodFooVersion(fooVersion)?)?{
??foo?=?null
}
//?..?then?later?in?your?program?..
### 总结
* 框架原理真的深入某一部分具体的代码和实现方式时,要多注意到细节,不要只能写出一个框架。
* 算法方面很薄弱的,最好多刷一刷,不然影响你的工资和成功率??
* 在投递简历之前,最好通过各种渠道找到公司内部的人,先提前了解业务,也可以帮助后期优秀 offer 的决策。
* 要勇于说不,对于某些 offer 待遇不满意、业务不喜欢,应该相信自己,不要因为当下没有更好的 offer 而投降,一份工作短则一年长则 N 年,为了幸福生活要慎重选择!!!
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://ali1024.coding.net/public/P7/Web/git)**
![](https://s2.51cto.com/images/20210925/1632501835229950.jpg)
喜欢这篇文章文章的小伙伴们点赞+转发支持,你们的支持是我最大的动力!
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/170615.html