欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

npm、npm scripts

程序员文章站 2022-03-03 18:57:37
...

1、 如何全局安装一个 node 应用?

npm install -g <package_name>

上述命令执行之后将会在当前的目录下创建一个 node_modules 的目录(如果不存在的话),然后将下载的包保存到这个目录下。

2、 package.json 有什么作用?

package.json 存储在项目的根目录下,内部保存了项目的相关信息(名称、版本等)以及该项目的依赖信息(生产环境依赖、开发环境依赖)。

package.json必须是纯JSON的,而不仅仅是一个JavaScript对象字面量。

package.json 中添加中文注释会编译出错。

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

package.json文件可以手工编写,也可以使用npm init命令自动生成(注意:npm init 时,用户需回答一些问题,然后在当前目录生成一个基本的package.json文件。所有问题之中,只有项目名称(name)和项目版本(version)是必填的,其他都是选填的)。

{
  "name": "test-demo0", //项目名称,发布项目后,可以通过该名称在npm上搜索到该项目,必须全网唯一
  "version": "1.0.0", //版本号,当项目做了改动时需要修改版本号再发布
  "description": "", //项目描述。
  "main": "index.js", //项目入口文件
  "scripts": { 
    "test": "echo "Error: no test specified" && exit 1"  //npm script 命令行,自定义的npm脚本,npm 内置了两个简写的命令:npm test 和 npm start,其它命令要写成 npm run xxx 形式,这个对象中的键值对键名代表npm脚本的命令,而值则代表实际执行的命令。
  },
  "keywords": [
    "demo0" //项目描述关键词
  ],
  "author": "xxx", //项目作者
  "license": "ISC", //项目遵循的开源协议
  "dependencies": { 
    "marked": "^0.3.6" //项目所依赖的包,当在执行npm install命令时,将会根据此对象中的属性来安装依赖。
  },
  "devDependencies": { 
    "easytpl": "^1.0.4" //项目构建者构建项目所依赖的包,这个对象中的依赖仅仅在构建项目时安装
  }
}

3、npm install --save app 与 npm install --save-dev app有什么区别?

  • npm install --save app: 将产品运行时(或生产环境)需要的依赖模块添加到 package.jsondependencies 中,在发布后还需要继续使用,否则就运行不了

  • npm install --save-dev app:将产品的开发环境需要的依赖模块添加到
    package.jsondevDependencies 中,只在开发时才用到,发布后用不到它。

区别在于:当你把项目发布上线后,别人使用 npm install使用你的项目时,并不会下载devDependencies里的模块。

4、node_modules的查找路径是怎样的?

从当前文件目录开始查找node_modules目录,如果没有,则进入父级目录,查找父级目录下的node_modules目录;直到根目录下的node_modules目录。

比如当前脚本文件/demo/src/foo.js,在该模块中使用require('bar')方式加载模块时,node内部运行过程如下:

/demo/src/node_modules/bar

/demo/node_modules/bar

/node_modules/bar

5、npm3与 npm2相比有什么改进?yarn和 npm 相比有什么优势?

  • npm2安装依赖的时候比较简单直接,直接按照包的依赖的树形结构下载填充至本地目录,缺陷在于太深的目录树结构会严重影响效率,甚至在window下可能会超出系统路径限制的长度,另外有删node_modules目录经历的可能都漫长的等待。

  • 针对 npm2 的问题,npm3 加了点算法,直白的解释就是:npm install 时会按照 package.json 里依赖的顺序依次解析,遇到新的包就把它放在第一级目录,后面如果遇到一级目录已经存在的包,会先判断版本,如果版本一样则忽略,否则会按照 npm2 的方式依次挂在依赖包目录下。

  • 在包版本差异化不太严重的情况下,这种构建方式会几乎把所有包放在一级目录下,很大程度下提升了效率以及节省了部分磁盘空间。

yarn优点在于只要通过Yarn安装过的套件都会在本地目录产生Cache,也就是说只要安装过一次,下次重新安装都会从Cache重新读取, 安装速度会提升很多。

6、webpack是什么?和其他同类型工具比有什么优势?

webpack是一款模块加载器兼打包工具,它能把各种资源JS/CSS/图片等都作为模块来使用和处理。优势如下:

  • webpack 是以 commonJS 的形式来书写脚本,但对 AMD/CMD 的支持也很全面,方便旧项目进行代码迁移。

  • webpack可以将代码拆分成多个区块,每个区块包含一个或多个模块,它们可以按需异步加载,极大地减少了页面初次加载时间。

  • webpack 本身只能处理原生的 JS 模块,但是 loader 转换器可以将各种类型的资源转换成 JS 模块。这样,任何资源都可以成为 webpack 可以处理的模块。

  • webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 JS 文件。

  • webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 webpack 插件,来满足各式各样的需求。

  • webpack使用异步 I/O 和多级缓存提高运行效率,使得它能够快速增量编译。

7、npm script是什么?如何使用?

  • package.json 文件有一个 scripts 字段,可以用于指定脚本命令,供 npm 直接调用。

  • npm 内置了两个简写的命令:npm test 和 npm start,其它命令要写成 npm run xxx 形式

9、gulp是什么?使用 gulp 实现图片压缩、CSS 压缩合并、JS 压缩合并

  • gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器

  • gulp不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成。

  • gulp是基于Nodejs的自动任务运行器, 能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件改动。

//安装插件
npm install gulp-imagemin --save-dev //图片压缩
npm install gulp-cssnano --save-dev //css压缩
npm install uglify --save-dev //js压缩
npm install gulp-jshint --save-dev //js规范检查
npm install gulp-concat --save-dev //文件合并
npm install gulp-rename --save-dev //重命名

//gulpfile.js
//引入插件
var gulp = require('gulp'),
    cssnano = require('gulp-cssnano'),
    concat = require('gulp-concat'),
    jshint = require('gulp-jshint'),
    uglify = require('gulp-uglify'),
    imagemin = require('gulp-imagemin'),
    rename = require('gulp-rename'),
 
  //css合并压缩
  gulp.task('build:css', function() {
      gulp.src('./src/css/*.css')
        .pipe(concat('merge.css'))
        .pipe(rename({
            suffix: '.min'
        }))
        .pipe(cssnano())
        .pipe(gulp.dest('dist/css/'));
  })

  //js合并压缩
   gulp.task('build:js', function() {
      gulp.src('src/js/*.js')
        .pipe(jshint())
        .pipe(jshint.reporter('default'))
        .pipe(concat('merge.js'))
        .pipe(rename({
          suffix: '.min'
        }))
        .pipe(uglify())
        .pipe(gulp.dest('dist/js/'));
  })

  //图片压缩
  gulp.task('build:image', function() {
      gulp.src('src/imgs/*')
        .pipe(imagemin())
        .pipe(gulp.dest('dist/imgs/'));
  })

gulp.task('build', ['build:css', 'build:js', 'build:image']);

//命令行
gulp build

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=zf25im08i89s