返回顶部
首页 > 资讯 > 前端开发 > JavaScript >OpenSCA技术原理npm依赖示例解析
  • 143
分享到

OpenSCA技术原理npm依赖示例解析

OpenSCA技术npm依赖OpenSCAnpm 2023-02-17 12:02:43 143人浏览 安东尼
摘要

目录npm介绍package-lock.JSONpackage.jsonnpm介绍 本文主要介绍基于npm包管理器的组件成分解析原理。 npm(全称node Package Man

npm介绍

本文主要介绍基于npm包管理器的组件成分解析原理。

npm(全称node Package Manager)是node.js标准的软件包管理器。

npm的依赖管理文件是package.json,开发者可以在package.json中指定每个依赖项的版本范围。

如果一个项目中存在package.json文件,便可以执行npm install命令自动安装和维护当前项目所需的所有模块并生成package-lock.json文件。

package.json完整文件结构如下:

{
  "name": "screeps",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "push": "rollup -cw --environment DEST:main",
    "build": "rollup -cw --environment DEST:local",
  },
  "keyWords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@rollup/plugin-commonjs": "^21.0.1",
    "@rollup/plugin-node-resolve": "^13.1.1",
    "@types/lodash": "^3.10.1",
    "@types/screeps": "^3.2.4",
    "rollup": "^2.61.1",
    "rollup-plugin-clear": "^2.0.7",
    "rollup-plugin-copy": "^3.4.0",
    "rollup-plugin-screeps": "^1.0.1",
    "rollup-plugin-typescript2": "^0.31.1",
    "typescript": "^4.5.4"
  },
  "dependencies": {
    "source-map": "^0.6.1"
  }
}

其中name为项目名,version为项目版本,license为项目声明的许可证,devDependencies为开发环境使用的依赖,dependencies为生产环境使用的依赖。

依赖写法为"name":"version",版本可以指定准确版本或一个范围,范围需遵循semver语义化版本规范

解析算法

package-lock.json

package-lock.json是在npm install时自动生成的文件,用以记录当前状态下实际安装的各个npm package的具体来源和版本号,通过该文件可以准确定位到npm项目的依赖及版本。所以优先解析package-lock.json文件。

package-lock.json文件结构如下:

{
  "name": "foo",
  "version": "1.0.0",
  "dependencies": {
    "b": {
      "version": "1.2.1"
    },
    "a": {
      "version": "2.1.5",
      "requires": {
        "b": "^1.1.9"
      }
    },
    "c": {
      "version": "1.3.1",
      "requires": {
        "b": "^1.2.0"
      }
    }
  }
}

其中name字段为项目名称,version字段为项目版本。dependencies字段中包含项目使用的所有直接和间接依赖,而且记录了组件间的依赖关系。

例如:

"b": {
  "version": "1.2.1"
},

代表组件b的版本号为1.2.1。

"a": {
  "version": "2.1.5",
  "requires": {
    "b": "^1.1.9"
  }
},

代表项目依赖2.1.5版本的组件a,该组件依赖版本约束为^1.1.9的组件b。

同理可知项目依赖1.3.1版本的组件c,该组件依赖版本约束为^1.2.0的组件b。

<package-lock.json文件结构> 可看出组件a和组件c都没有被其他组件所依赖,所以可知这两个组件是项目的直接依赖。

仅通过package-lock.json无法确定组件b是否是直接依赖,可以结合package.json文件进一步确定,没有package.json时,将b当作间接依赖处理。若一个组件同时为直接和间接依赖,按直接依赖处理。

注:

  • ^1.1.9代表版本号需要>=1.1.9且<2.0.0;
  • ^1.2.0代表版本号需要>=1.2.0且<2.0.0;
  • 更多约束格式请参阅semver官网

由此可以构建出当前项目的依赖结构:

实线代表直接依赖,虚线代表间接依赖。

package.json

package.json为开发者编写管理的依赖管理文件,在未找到package-lock.json文件时将解析该文件。

package.json仅包含直接依赖,在项目构建时会从npm仓库下载需要的间接依赖并构建为package-lock.json文件,因此可以模拟npm构建流程来获取项目引用的组件依赖。

package.json文件结构如下:

{
  "name": "foo",
  "version": "1.0.0",
  "devDependencies": {
    "a": "^2.0.0"
  },
  "dependencies": {
    "c": "^1.1.0"
  }
}

dependencies为项目实际使用的直接依赖,devDependencies为项目开发时使用的直接依赖。

例如:

"devDependencies": {
  "a": "^2.0.0"
}

代表项目开发过程中依赖版本约束为^2.0.0的组件a。

"dependencies": {
  "c": "^1.1.0"
}

代表项目直接依赖版本约束为^1.1.0组件c。

分析到这里我们可以总结出如下图依赖关系:

通过该依赖关系可以看出项目组件的直接依赖及组件的版本范围,但无法得知组件依赖的具体版本。

在没有package-lock.json文件的情况下,为了进一步获取依赖的准确版本及间接依赖,需要从npm仓库下载对应组件的详细信息。

例如组件a的详细信息结构为:

{
  "time": {
    "2.1.5": "2011-02-16T22:31:02.088Z",
    "3.1.1": "2011-04-10T12:23:22.088Z"
  },
  "versions": {
    "2.1.5": {
      "dependencies": {
        "b": "^1.1.9"
      }
    },
    "3.1.1": {
      "dependencies": {
        "b": "^2.2.0"
      }
    }
  }
}

其中time字段为组件所有版本及发布日期,根据约束从这里获取约束范围内的最大版本。

versions字段为组件各个版本对应的详细信息,其中dependencies字段为组件的依赖信息。

对于本例来说,组件a的约束为^2.0.0,要求版本号>=2.0.0且<3.0.0,所以选择2.1.5版本。因此组件依赖结构就变成了:

按照这种方式层级解析便可获取整个项目的依赖信息。

感谢每一位开源社区成员对OpenSCA的支持和贡献。

OpenSCA已在GitHubgitee开源,欢迎Star和PR,成为我们的开源贡献者,也可提交问题或建议至Issues。我们会参考大家的建议不断完善OpenSCA开源项目,敬请期待更多功能的支持。

OpenSCA官网:
opensca.xmirror.cn/

GitHub:
github.com/XmirrorSecu…

Gitee:
gitee.com/XmirrorSecu…。

以上就是OpenSCA技术原理npm依赖示例解析的详细内容,更多关于OpenSCA技术npm依赖的资料请关注编程网其它相关文章!

--结束END--

本文标题: OpenSCA技术原理npm依赖示例解析

本文链接: https://lsjlt.com/news/196593.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • OpenSCA技术原理npm依赖示例解析
    目录npm介绍package-lock.jsonpackage.jsonnpm介绍 本文主要介绍基于npm包管理器的组件成分解析原理。 npm(全称Node Package Man...
    99+
    2023-02-17
    OpenSCA技术npm依赖 OpenSCA npm
  • Spring循环依赖原理实例分析
    本篇内容介绍了“Spring循环依赖原理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!简介概述@Autowired进行属性注入可以解...
    99+
    2023-07-02
  • SpringBootStarter依赖原理与实例详解
    目录1 Starter2 了解 spring.factories机制2.1 不同包路径下的依赖注入2.2 spring.factories 机制3 spring.factories ...
    99+
    2024-04-02
  • Go语言依赖管理三要素示例解析
    目录背景GOPATH 模式GO Vendor模式Go Module模式依赖管理三要素依赖配置 go.modgo mod命令go get命令快速使用go module小结背景 开发项...
    99+
    2023-01-28
    Go语言依赖管理 Go 依赖管理
  • golang依赖管理之mod的示例分析
    这篇文章主要介绍了golang依赖管理之mod的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。golang 依赖管理之 modgo 很早就考虑了依赖管理的问题,内置 ...
    99+
    2023-06-14
  • C#中依赖倒置原则DIP的示例分析
    这篇文章主要介绍C#中依赖倒置原则DIP的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、前言我们先来看看传统的三层架构,如下图所示:从上图中我们可以看到:在传统的三层架构中,层与层之间是相互依赖的,UI层...
    99+
    2023-06-29
  • Spring解决循环依赖的示例分析
    这篇文章主要介绍Spring解决循环依赖的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!  这里我们先借用一张图来通过视觉感受一下,看图:    其实,通过上面图片我想你应该能看图说话了,所谓的循环依赖其实就...
    99+
    2023-06-25
  • Spring Boot配置排序依赖技巧的示例分析
    这篇文章主要介绍Spring Boot配置排序依赖技巧的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!具体如下:Spring Boot - 被错误使用的注解我自己曾经在 Spring Boot 中集成通用 M...
    99+
    2023-05-30
    spring boot
  • 深入浅析python3 依赖倒置原则(示例代码)
    场景 针对园区停车信息,需要对各个公司提供的停车数据进行整合并录入自家公司的大数据平台 数据的录入无外乎就是对数据的增删改查 下面上一个常规的写法(未符合依赖倒置),整合来自 长安...
    99+
    2024-04-02
  • JVMCPUProfiler技术原理及源码的示例分析
    JVMCPUProfiler技术原理及源码的示例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。引言研发人员在遇到线上报警或需要优化系统性能时,常常需要分析程...
    99+
    2023-06-03
  • seajs中模块依赖加载处理的示例分析
    这篇文章将为大家详细讲解有关seajs中模块依赖加载处理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:比如现有3个文件: define(functio...
    99+
    2024-04-02
  • Ajax技术组成与核心原理的示例分析
    这篇文章将为大家详细讲解有关Ajax技术组成与核心原理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、Ajax特点:局部刷新、提高用户的体验度,数据从服务器商...
    99+
    2024-04-02
  • Android热修复技术原理之资源热修复技术的示例分析
    小编给大家分享一下Android热修复技术原理之资源热修复技术的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、普遍的实现方式目前市面上的很多资源热修复...
    99+
    2023-06-20
  • PHP开发者必须知道的索引技术,如何使用NPM来管理依赖?
    索引技术是现代软件开发中的重要组成部分。它们允许开发者快速地查找和获取所需的依赖项。在PHP开发中,有几种索引技术可用于管理依赖项。在本文中,我们将探讨这些技术,并介绍如何使用NPM来管理您的PHP项目依赖项。 Composer Co...
    99+
    2023-08-07
    索引 http npm
  • iOS应用重签名ipa技术原理及示例分析
    小编今天带大家了解iOS应用重签名ipa技术原理及示例分析,文中知识点介绍的非常详细。觉得有帮助的朋友可以跟着小编一起浏览文章的内容,希望能够帮助更多想解决这个问题的朋友找到问题的答案,下面跟着小编一起深入学习“iOS应用重签名ipa技术原...
    99+
    2023-06-05
  • Vue 响应式系统依赖收集过程原理解析
    目录背景目标源码解读入口函数:observeclass ObserverObserve 如何处理数组Observe 如何处理对象class DepDep.targetclass Wa...
    99+
    2024-04-02
  • vue3 reactive响应式依赖收集派发更新原理解析
    目录proxy依赖收集currentEffect派发更新总结proxy vue3的响应式实现依旧是依赖收集与派发更新,本节乃至后面涉及的代码都是经过简化,文章目的是讲解原理,直接贴...
    99+
    2023-03-06
    vue3 reactive响应式 reactive依赖收集派发更新
  • C#面向对象编程中依赖反转原则的示例详解
    在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特·C·马...
    99+
    2024-04-02
  • 汇编语言中计算机底层技术原理的示例分析
    这篇文章将为大家详细讲解有关汇编语言中计算机底层技术原理的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.机器语言何为语言,就是人和人之间交流的工具。而汇编语言就是计算机的语言。机器语言(二进制...
    99+
    2023-06-25
  • jsjiami.v6解密原理示例分析
    正文 JS加密是Web前端开发中常用的一种技术,可以用于保护敏感数据或者代码,避免被恶意攻击者窃取或篡改。其中,JS加密库JSJiami.v6是一款广受欢迎的JS加密库,下面我们...
    99+
    2023-05-16
    jsjiami.v6解密分析 jsjiami.v6 解密
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作