由于npm
会扁平化的安装依赖,所以prop-types@15.5.0
会安装到顶级node_modules
中。由于顶级node_modules
已经有了prop-types@15.5.0
,所以react内部所依赖的prop-types@15.6.2
会安装在react内部的node_modules
中。假如我们再安装一个react-xxx@3.1.0
,他依赖于prop-types@15.5.0
和react@16.12.0
,所以,此时的node_modules
结构图如下:
npm在安装依赖时,首先在顶级node_modules下安装了react-xxx@3.1.0由于prop-types@15.5.0
和顶级node_modules
下的prop-types版本相同,所以不再单独安装由于react和顶级node_modules下的react版本不一致,所以在自己node_modules
内部单独安装react@16.12.0
。· 这种方法的缺点是,npm必须首先遍历所有的项目依赖关系,然后再决定如何生成扁平的node_modules目录结构。npm必须为所有使用到的模块构建一个完整的依赖关系树,这是一个耗时的操作,是npm安装速度慢的一个很重要的原因。· npm是有本地缓存的,它保存了已经下载的每个版本的压缩包。本地缓存的内容可以通过npm cache ls
命令进行查看。本地缓存的设计有助于减少安装时间。npm
安装插件是从国外服务器下载,受网络影响大,可能出现异常,如果npm的服务器在中国就好了,于是淘宝团队干了这事。来自官网:“这是一个完整 npmjs.org
镜像,你可以用此代替官方版本(只读),同步频率目前为 10分钟 一次以保证尽量与官方服务同步。”· 像npm一样,yarn使用本地缓存。与npm不同的是,yarn无需互联网连接就能安装本地缓存的依赖项,它提供了离线模式。npm 出现之前:前端依赖项是保存到存储库中并手动下载的📁2012:npm 的使用量急剧增加——主要是由于 Browserifys 浏览器的支持🎉2012:npm 有了一个竞争对手 bower,它完全支持浏览器💻2012-2016:前端项目的依赖项数量成倍增加🤯2012-2016:构建和安装前端应用变得越来越慢🐢2012-2016:大量(重复的)依赖项存储在神奇的 node_modules 内的嵌套文件夹中☢️2012-2016:rm -rf node_modules 成为前端开发人员最常用的命令。🗑2015:node_modules 被修改为扁平化的文件结构!🕸yarn.lock 能够锁定安装的版本并提供确定性的依赖关系。不再 rm -rf node_modules!yarn install 花费的时间是 npm install 的一半(不使用缓存的前提下)不幸的是,一些错误和超出其管理能力的承诺导致该工具的声誉下降package-lock.json 是他们的新工具,shrinkwrap 被放在一边package-lock.json 开始与 yarns 锁定文件竞争直接用 package-lock.json 构建代码避免使用 node_modules,而是为项目中的每个依赖项创建一个带有哈希值的文件鉴于使用semver(语义版本控制),所有的版本都有 3 个数字,主版本.次版本.补丁版本,具有以下规则:~: 如果写入的是 〜0.13.0,则只更新补丁版本:即 0.13.1 可以,但 0.14.0 不可以。^: 如果写入的是 ^0.13.0,则要更新补丁版本和次版本:即 0.13.1、0.14.0、依此类推。*: 如果写入的是 *,则表示接受所有的更新,包括主版本升级。可选字段,必须是字符串。当前包的描述信息,是一个字符串。它可以帮助人们在使用npm search时找到这个包。如果 package.json 中没有 description 信息,npm 使用项目中的 README.md 的第一行作为描述信息。这个描述信息有助于别人搜索你的项目,因此建议好好写 description 信息。可选字段,scripts是一个由脚本命令组成的hash对象,他们在包不同的生命周期中被执行。key是生命周期事件,value是要运行的命令。指定了运行脚本命令的npm命令行缩写,比如start指定了运行npm run start时,所要执行的命令。我们可以自定义我们想要的运行脚步命令。包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github /Gitlab上可选字段,项目关键字,是一个字符串数组。它可以帮助人们在使用npm search时找到这个包。可选字段, 表示定义适用于package.json所描述代码的许可证。不同的协议有不同的限制。让用户知道他们有何权限来使用你的模块,以及使用该模块有哪些限制。npm install nrm -g // 下载
nrm ls // 查看所有源
nrm use <registry>
nrm add <registry> <url>
nrm del <registry>
您需要具备webpack方面基本配置的能力,或者查阅webpack官方文档,进行学习,可以帮助您更快的搭建起一个属于自己的npm包。npm install <package> -S/-D
这里的-D是生成devDependencies, -S生成dependencies建议生成-D,因为我们制作的npm包最后会打包压缩,在使用的场景下不会再下载这些依赖1.touch webpack.config.js
2.vim webpack.config.js
module.exports = {
entry: {
test: './index.js',
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js',
libraryTarget: 'umd',
library: 'test',
libraryExport: 'default',
umdNamedDefine: true,
},
module: {
rules: [
{
test: /\.js$/,
use: [
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: ['@babel/preset-env'],
},
},
],
},
],
},
}
mkdir src
cd src
touch index.js
console.log(‘test my npm!’)
let me see your package.json filemodule.exports = {
entry: {
test: './index.js',
},
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].js',
libraryTarget: 'umd', // 将你的 library 暴露为所有的模块定义下都可运行的方式
library: 'test', // 如果生成的输出文件,是在 HTML 页面中作为一个 script 标签引入,则变量 MyLibrary 将与入口文件的返回值绑定。
libraryExport: 'default', // 导出的模块名称
umdNamedDefine: true, // 当使用 libraryTarget: "umd" 时,设置 output.umdNamedDefine 为 true 将命名由 UMD 构建的 AMD 模块。否则将使用一个匿名的 define。
},
module: {
rules: [
{
test: /\.js$/,
use: [
{
loader: 'babel-loader',
options: {
cacheDirectory: true,
presets: ['@babel/preset-env'],
},
},
],
},
],
},
}
关于umd amd es6 modules 说明请参考以下链接:https://zhuanlan.zhihu.com/p/75980415修改package.json的main为这个文件dist/test.js,然后他就是这个样子{
"name": "npmtestlkz",
"version": "1.0.0",
"main": "dist/test.js",
"author": "likaizhu",
"license": "MIT",
"description": "a demo for test npm",
"scripts": {
"build": "webpack --config webpack.config.js"
},
"keywords": [
"demoTest",
],
}
nrm use npm // 切换源
npm login // 登录
npm publish // 发布
· 登录需要你去npm上注册一个账号具体不多说了,很简单· 发布的时候记住自己包的名字不能在npm上有重复的· 有的同学以前可能注册过账号,但是邮箱记错了,可能导致发包失败,记得npm官网上看看自己的setting(小编就出了这个问题)制作npm的过程涉及到很多细小的点,大家可以做一下参考哦1. 首先我们开发的npm包的功能需要测试,想直观看到界面的变化,或者检测功能是否有问题,可以启动一个dev环境的服务,测试2. 环境可能对应有一些环境变量不同,可以采用.env的方式进行环境区分,使用不同环境的变量,这里需要cross-env,dotenv-webpack支持我们写的包可以使用es6,比如箭头函数,async等,需要转成浏览器识别的语言,可以使用babel中的一些插件使用者可以用script标签引入或者使用import方式引入,但是需要注意使用路径,如果通过script方式引入的时候,需要注意项目中是否引入了eslint,eslint可能会检测文件夹下文件的规则,需要在webpack配置文件中指定忽略路径以下是小编自己制作的一个简单npm包的demo,希望可以帮助大家更好的理解以上的注意事项https://github.com/likaizhu/npm-start前端先锋: https://juejin.cn/post/6844904030741921800今天的风真是喧嚣: https://juejin.cn/post/6870426598605062152本次分享的内容不一定全部正确,如果有质疑的问题,欢迎大家提出,我会再次更新本篇文章,如果喜欢的话,就给个小花花吧!!!