nodejs - 包结构

发布于:2024-04-19 ⋅ 阅读:(18) ⋅ 点赞:(0)

包结构

包结构实际上是一个存档文件,即一个目录大包围.zip或者tar.gz格式的文件,安装之后还原为目录,完全符合CommonJS规范的包目录应该包括如下
```dotnetcli
package.json: 包描述文件
bin: 存放二进制文件的目录
lib: 用于存放JavaScript代码的目录
doc: 存放文档的目录
test: 用于存放单元测试用例的代码
```
+ package.json
  CommonJS为packjson.age 文件定义了一些必要的字段
  + 包规范
  ```dotnetcli
  name: 包名: 小写的字母和数字组成,可以包含._-等,但是不允许出现空格。包名不许是唯一的。NPM建议不要再包名中附加node或者js来重复表示是JavaScript或node模块
  description: 包简介
  version: 版本号
  keyword: 关键词数组,NPM中主要用来作分类检索,一个好的关键词数组有利于用户快速找到编写的包。
  maintainers: 包维护列表,每个维护者有name,emial和web这三个属性。npm通过该属性进行权限认证
  contributors: 贡献者列表,再开源社区中,为开源项目提供代码的贡献者列表
  bugs: 一个可以反馈bug的网站地址或者邮件地址
  licenses: 当前包所使用的许可证列表,表示这些包在那些许可证下可以使用。[{"type": "GPLv2", "url": "https"}]
  repositories: 托管源代码的位置列表,表明可以通过那些方式和地址访问包的源代码
  dependencies: 使用当前包所需要的依赖,NPM会通过这个属性帮助自动加载依赖的包
  homepage: 当前包的网站地址
  os: 操作系统支持列表
  cpu:cpu架构的支持列表
  engine: 支持的JavaScript引擎: ejs flusspgferd gpsee jsc spidermonkey narwhal node v8
  builtin: 表示当前包是哦股在内奸在底层系统的标准组件
  directories: 包目录说明
  implements: 实现规范的列表,标志当前包实现了commonjs的那些规范
  scripts: 脚本说明对象,被包管理器来安装,编译测试和卸载包
      "script" : {
        "install": "uninstall.js",
        "build": "build.js",
        "doc": "make-doc.js",
        "test": "test.js"
      }
```
+ 包文件
    ```dotnetcli
    author: 包作者
    bin: 一些包作者希望包可以添加到命令行工具中使用,配置好bin之后,通过npm install package_name -g命令可以将脚本添加到执行路径中去,之后可以在命令行中直接执行
    main: 模块引入方法,在require引入包的时候,会先价差这个字段,将其作为模块的入口,如果不存在这个字段,require方法会查找包目录下的index.js index.node index.json 文件作为默认入口
    devDependencies: 一些模块中旨在开发的时候需要依赖,配置这些属性,可以提示包的后续开发者依赖包。
    ```

局域NPM

+ NPM仓库主要是由两部分组成,体现在源代码中分别是www和registry,www和NPM站点的界面,registry则是利用CouchDB存储模块包文件和提供JSON API 面向NPM站点和NPM命令行工具服务
+ ![alt text](image-5.png)
+ 安装npm仓库环境[百度]
    1. 安装Erlang
    2. 安装CouchDB

前后端共用模块

  1. 模块的侧重点
  • 前后端JavaScript分别在http的两端。浏览器的JavaScript需要尽力从一个同意服务器端分发到多个客户端执行,而服务端JavaScript则相同的代码需要多次执行,前者的瓶颈在于代换,后者的瓶颈在于cpu和内存等资源
  1. AMD规范
    1. id和依赖是可以选择的,和node模块相似之处在于工厂的内容实际就是代码的内容
     define(function() {
        var exports = {};
        exports.sayhello = function () {
          console.log(module.id)
        }
        return exports
       })
    
    AMD模块需要使用define来定于一个模块,而在node中是显示包装的。目的是作用域隔离,仅在需要的时候被引入,避免通过全局变量或者命名空间的方式,避免变量污染和被修改。内容需要分会的方式实现导出
  2. CMD规范
    定义模块和依赖引入和AMD规范有所不同。
    1. 依赖部分
    define(function(require, exports, module)) {
      // code
    }
    define(factory)