面试官问了我很多package.json的知识,还好我早有准备!

简介: 【10月更文挑战第18天】面试官问了我很多package.json的知识,还好我早有准备!

背景

最近疯狂面试,终于有一个公司要了我。面试官问了我很多八股文的东西,我背了很多,问题基本都能应付过去。于是,面试官另辟蹊径,直接问我package.json的相关知识,有没有实际经验,问这个最合适不过了。

还好,我听了朋友的建议,早有准备!面试官问了我很多package.json中的细节:

比如依赖安装、dependencies和devDependencies的区别,版本锁死等等问题!

面试中,这个问题大家准备的估计都很少,因此,我分享一下自己准备的知识。

package.json核心知识详解

官方文档:https://www.w3cschool.cn/doc_npm/npm-files-package-json.html

💡 每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。

概述

下面是一个最简单的package.json文件,只定义两项元数据:项目名称和项目版本。

{
   
  "name" : "xxx",
  "version" : "0.0.0",
}

package.json文件就是一个JSON对象,该对象的每一个成员就是当前项目的一项设置。比如name就是项目名称,version是版本(遵守“大版本.次要版本.小版本”的格式)。

下面是一个更完整的package.json文件。

{
   
    "name": "Hello World",
    "version": "0.0.1",
    "author": "张三",
    "description": "第一个node.js程序",
    "keywords":["node.js","javascript"],
    "repository": {
   
        "type": "git",
        "url": "https://path/to/url"
    },
    "license":"MIT",
    "engines": {
   "node": "0.10.x"},
    "bugs":{
   "url":"http://path/to/bug","email":"bug@example.com"},
    "contributors":[{
   "name":"李四","email":"lisi@example.com"}],
    "scripts": {
   
        "start": "node index.js"
    },
    "dependencies": {
   
        "express": "latest",
        "mongoose": "~3.8.3",
        "handlebars-runtime": "~1.0.12",
        "express3-handlebars": "~0.5.0",
        "MD5": "~1.2.0"
    },
    "devDependencies": {
   
        "bower": "~1.2.8",
        "grunt": "~0.4.1",
        "grunt-contrib-concat": "~0.3.0",
        "grunt-contrib-jshint": "~0.7.2",
        "grunt-contrib-uglify": "~0.2.7",
        "grunt-contrib-clean": "~0.5.0",
        "browserify": "2.36.1",
        "grunt-browserify": "~1.3.0",
    }
}

package.json文件的生成

package.json文件可以手工编写,也可以使用npm init命令自动生成。

npm init

这个命令采用互动方式,要求用户回答一些问题,然后在当前目录生成一个基本的package.json文件。所有问题之中,只有项目名称(name)和项目版本(version)是必填的,其他都是选填的。

有了package.json文件,直接使用npm install命令,就会在当前目录中安装所需要的模块。

 npm install

如果一个模块不在package.json文件之中,可以单独安装这个模块,并使用相应的参数,将其写入package.json文件之中。

$ npm install express --save
$ npm install express --save-dev

上面代码表示单独安装express模块,--save参数表示将该模块写入dependencies属性,--save-dev表示将该模块写入devDependencies属性。

基本核心字段

name

  • 类型:字符串
  • 说明:项目名称,通常是小写字母,数字,中划线或下划线,不允许有空格。
  • 示例:"name": "my-awesome-project"

version

  • 类型:字符串
  • 说明:项目版本号,遵循语义化版本(Semantic Versioning)规范。
  • 示例:"version": "1.0.0"

description

  • 类型:字符串
  • 说明:项目的简短描述。
  • 示例:"description": "A brief description of the project"

main

  • 类型:字符串
  • 说明:项目的入口文件,默认是 index.js。
  • 示例:"main": "index.js"

main字段指定了加载的入口文件,require('moduleName')就会加载这个文件。这个字段的默认值是模块根目录下面的index.js。

scripts

  • 类型:对象
  • 说明:定义可以通过 npm run 命令执行的脚本命令。

scripts指定了运行脚本命令的npm命令行缩写,比如start指定了运行npm run start时,所要执行的命令。

下面的设置指定了npm run preinstall、npm run postinstall、npm run start、npm run test时,所要执行的命令

"scripts": {
   
  "preinstall": "echo here it comes!",
    "postinstall": "echo there it goes!",
    "start": "node index.js",
    "test": "tap test/*.js"
}

keywords

  • 类型:数组
  • 说明:项目的关键字数组,有助于在npm中搜索。
  • 示例:"keywords": ["node", "express", "api"]

author

  • 类型:字符串或对象
  • 说明:项目作者的名字、电子邮件和主页。
  • 示例:"author": "Jane Doe jane.doe@example.com (http://janedoe.com)"

license

  • 类型:字符串
  • 说明:项目的许可证类型。
  • 示例:"license": "MIT"

repository

  • 类型:对象
  • 说明:项目的版本控制存储库信息。
  • 示例
"repository": {
  "type": "git",
  "url": "https://github.com/user/repo.git"
}

核心依赖字段

dependencies及devDependencies字段

dependencies字段指定了项目运行所依赖的模块,devDependencies指定项目开发所需要的模块。

它们都指向一个对象。该对象的各个成员,分别由模块名和对应的版本要求组成,表示依赖的模块及其版本范围。

{
  "devDependencies": {
    "browserify": "~13.0.0",
    "karma-browserify": "~5.0.1"
  }
}

对应的版本可以加上各种限定,主要有以下几种:

  • 指定版本:比如1.2.2,遵循“大版本.次要版本.小版本”的格式规定,安装时只安装指定版本。
  • 波浪号(tilde)+指定版本:比如~1.2.2,表示安装1.2.x的最新版本(不低于1.2.2),但是不安装1.3.x,也就是说安装时不改变大版本号和次要版本号。
  • 插入号(caret)+指定版本:比如ˆ1.2.2,表示安装1.x.x的最新版本(不低于1.2.2),但是不安装2.x.x,也就是说安装时不改变大版本号。需要注意的是,如果大版本号为0,则插入号的行为与波浪号相同,这是因为此时处于开发阶段,即使是次要版本号变动,也可能带来程序的不兼容。
  • latest:安装最新版本。

其他

browser字段

browser指定该模板供浏览器使用的版本。Browserify这样的浏览器打包工具,通过它就知道该打包那个文件。

"browser": {
  "tipso": "./node_modules/tipso/src/tipso.js"
},

browserslist

类型:数组或字符串

说明:指定项目的目标浏览器,通常用于前端构建工具的兼容性处理。

"browserslist": [
  ">1%",
  "last 2 versions",
  "not ie <= 8"
]

prettier

类型:对象

说明:项目的Prettier代码格式化工具配置。

"prettier": {
  "singleQuote": true,
    "trailingComma": "all"
}
相关文章
|
6月前
|
JSON 自然语言处理 前端开发
【面试题】JSON.stringify 和fast-json-stringify有什么区别
【面试题】JSON.stringify 和fast-json-stringify有什么区别
|
6月前
|
JSON 前端开发 Java
【面试题】对 JSON.stringify()与JSON.parse() 理解
【面试题】对 JSON.stringify()与JSON.parse() 理解
|
3月前
|
JSON Java 数据格式
【IO面试题 七】、 如果不用JSON工具,该如何实现对实体类的序列化?
除了JSON工具,实现实体类序列化可以采用Java原生序列化机制或第三方库如Protobuf、Thrift、Avro等。
|
JSON Java 数据格式
java面试题:返回Json用什么注解?
java面试题:返回Json用什么注解?
java面试题:返回Json用什么注解?
|
JSON 测试技术 数据格式
软件测试面试题:json和字典的区别?
软件测试面试题:json和字典的区别?
80 0
|
JSON 前端开发 数据格式
牛客刷题——前端面试【三】谈一谈Promise、封装ajax、json数据使用
如何使用Promise、封装ajax、json数据以下方法告诉你。
193 0
|
JSON JavaScript 程序员
|
3月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
12天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
14天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
39 4
下一篇
无影云桌面