npm-npmscript-gulp-webpack

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

npm install -g packageName

2. package.json 有什么作用?

执行npm init -y生成package.json文件,该文件对项目记录了一些配置信息,主要是用来进行包管理。包括name、version、description、author、private、scripts、dependencies、decDependencies等。

  • name:项目名称
  • version:项目版本
  • description:描述内容
  • main:主程序入口
  • scripts:命令行工具,打造前端自动化流程
  • dependencies:指定了项目运行所依赖的模块
  • devDependencies:项目开发所需要的模块
  • keywords:可选字段,字符串数组。npm search的时候会用到。
  • bin:可选字段。很多的包都会有执行文件需要安装到PATH中去。所有node_modules/.bin/目录下的命令,都可以用npm run [命令]的格式运行。在命令行下,键入npm run,然后按tab键,就会显示所有可以使用的命令。

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

  • npm install --save apppackage.json中创建
"dependencies  ": {
    "app": "xxx",
}

发布之后,项目运行仍依赖这个模块,会被用户下载。

  • npm install --save-dev apppackage.json中创建
"devDependencies": {
    "app": "xxx",
}

开发时依赖于这个模块,项目正常运行时不需要这个模块,不会被用户所下载

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

require模块时,先在当前目录查找node_modules下的模块,如果没有,再往上一级目录中查询node_modules下的模块,层层递进,直到系统根目录。
比如某个模块的绝对路径是/home/user/foo.js,在该模块中使用require('bar')方式加载模块时,node将在下面的位置进行搜索:
/home/user/node_modules/bar
/home/node_modules/bar
/node_modules/bar

5. npm3与 npm2相比有什么改进?

npm2 安装依赖的时候比较简单直接,直接按照包依赖的树形结构下载填充本地目录结构。
因为 npm 设计的初衷就是考虑到了包依赖的版本错综复杂的关系,同一个包因为被依赖的关系原因会出现多个版本,简单地填充结构保证了无论是安装还是删除都会有统一的行为和结构。
比如一个 App 里模块 A 和 C 都依赖 B,无论被依赖的 B 是否是同一个版本,都会生成对应结构:
npm2缺点:太深的目录树结构会严重影响效率,甚至在 Windows 下可能会超出系统路径限制的长度。



npm3加了点算法,直白的解释就是:npm install 时会按照 package.json 里依赖的顺序依次解析,遇到新的包就把它放在第一级目录,后面如果遇到一级目录已经存在的包,会先判断版本,如果版本一样则忽略,否则会按照 npm2 的方式依次挂在依赖包目录下。
npm3优点:这种构建方式会几乎把所有包放在一级目录下,很大程度上提升了效率以及节省了部分磁盘空间。
npm2 和 npm3 生成的结构对比:

对比图

yarn和 npm 相比有什么优势?

  1. Yarn 有一个锁定文件 (lock file) 记录了被确切安装上的模块的版本号。每次只要新增了一个模块,Yarn 就会创建(或更新)yarn.lock 这个文件。这么做就保证了,每一次拉取同一个项目依赖时,使用的都是一样的模块版本,现在npm5.0在模块安装后,也会生成一个package-lock.json文件,也有类似的作用。
  2. Yarn在拉取包的时候,是采用了并行安装,所以相较于npm的列队安装的速度会快很多。

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

webpack 是一个现代 JavaScript 应用程序的模块打包器(module bundler)。当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成少量的 bundle - 通常只有一个,由浏览器加载。

优势:
  • webpack可以将代码拆分成多个区块,每个区块包含一个或多个模块,它们可以按需异步加载,极大地减少了页面初次加载时间。
  • webpack的核心是 一切皆模块的思想
    任何模块,CSS,图片,字体,都被webpack当做模块来处理,我们只需要在需要这些模块的时候来require,这样,开发的时候,逻辑就很清晰。开发人员就可以让文件分割的彻底,变成一个个的块。只要配置好webpack,就可以实现按需要来加载这些块。
  • Loader
    Webpack 本身只能处理原生的 JavaScript模块,但是 loader 转换器可以将各种类型的资源转换成 javascript模块。这样,任何资源都可以成为 Webpack 可以处理的模块。
  • 智能解析
    Webpack 有一个智能解析器,几乎可以处理任何第三方库,无论它们的模块形式是 CommonJS、 AMD 还是普通的 js文件。甚至在加载依赖的时候,允许使用动态表达式 require("./templates/" + name + ".jade")。
  • 插件系统
    Webpack 还有一个功能丰富的插件系统。大多数内容功能都是基于这个插件系统运行的,还可以开发和使用开源的 Webpack 插件,来满足各式各样的需求。
  • 快速运行
    Webpack 使用异步 I/O 和多级缓存提高运行效率,这使得 Webpack 能够以令人难以置信的速度快速增量编译。

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

npm script 是利用packge.json中 scripts 这个属性,制定一个工作流。
比如 ''test'':''mkdir abc'',我们就可以直接使用npm test在当前文件夹创建一个 mkdir abc;
(但是除了 test和start,设置的其他命令均需要 用npm run xxx来启用),对此,我们可以在命令行的使用上就可以简化很多。不用来敲很多代码,来执行一个命令,而是敲少量的代码,来执行一系列的事情。
npm script会将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径。比如,当前项目的依赖里面有 Mocha,只要直接写mocha test就可以了。

8. 使用 webpack 替换 入门-任务15中模块化使用的 requriejs

代码
效果

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

gulp是前端开发过程中对代码进行构建的工具,是自动化项目的构建利器;它不仅能对网站资源进行优化,而且在开发过程中很多重复的任务能够使用正确的工具自动完成;使用它,我们不仅可以很愉快的编写代码,而且大大提高我们的工作效率。
gulp是基于Nodejs的自动任务运行器, 她能自动化地完成 javascript/coffee/sass/less/html/image/css 等文件的的测试、检查、合并、压缩、格式化、浏览器自动刷新、部署文件生成,并监听文件在改动后重复指定的这些步骤。在实现上,她借鉴了Unix操作系统的管道(pipe)思想,前一级的输出,直接变成后一级的输入,使得在操作上非常简单。

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
//引入插件
const gulp = require('gulp');
const cssnano = require('gulp-cssnano');
const concat = require('gulp-concat');
const jshint = require('gulp-jshint');
const uglify = require('gulp-uglify');
const imagemin = require('gulp-imagemin');
const 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

10. 开发一个 node 命令行天气应用用于查询用户当前所在城市的天气,发布到 npm 上去。

npm install mamba-weather -g
weather 北京

源码地址

1
1
1
1
1
1
1
1
1
1

推荐阅读更多精彩内容