blog icon indicating copy to clipboard operation
blog copied to clipboard

npm-npmscript-gulp-webpack

Open yongheng2016 opened this issue 8 years ago • 0 comments

题目1: 如何全局安装一个 node 应用?

npm install -g xxx

题目2: package.json 有什么作用?

一般每个项目根目录下都有一个package.json文件,用来定义本项目的配置信息、需要加载的模块

npm init   //初始化,设置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":"[email protected]"},
	"contributors":[{"name":"李四","email":"[email protected]"}],
	"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",
	}
}
  • scripts 指定运行脚本命令的npm命令行缩写,如:
"scripts": {
    "preinstall": "echo here it comes!",
    "postinstall": "echo there it goes!",
    "start": "node index.js",
    "test": "tap test/*.js"
}
  • dependencies 指定项目生产环境下所依赖的模块

  • devDependencies 指定项目开发环境下所依赖的模块

  • main 指定了加载的入口文件,默认是根目录下的index.js

  • config 用于添加命令行的环境变量

参考:http://javascript.ruanyifeng.com/nodejs/packagejson.html

题目3: npm install --save app 与 npm install --save-dev app有什么区别?

  • npm install --save app 简写:-S //大写 生产环境下的依赖,即产品上线后仍要使用的依赖

  • npm install --save-dev app 简写:-D //大写 开发环境下的依赖,即开发环境下的辅助工具,产品上线后不用

题目4: node_modules的查找路径是怎样的?

  • 如果传递给require()的参数不是核心模块,也没有以./..//开头,则Node.js会从当前模块的父目录开始,尝试在它的 /node_modules 文件夹里加载相应模块
  • 如果没有找到,那么就再向上一级目录移动,直到文件系统的根目录为止。
  • 如:在'/home/ry/projects/foo.js'文件里调用了require('bar.js'),查找顺序为:
/home/ry/projects/node_modules/bar.js
/home/ry/node_modules/bar.js
/home/node_modules/bar.js
/node_modules/bar.js

参考:

题目5: npm3与 npm2相比有什么改进?yarn和 npm 相比有什么优势? (选做题目)

  • npm2存在问题:
    • 由于npm在设计时考虑到同一个依赖包的不同版本这种错综复杂关系,所以npm2版本采用的安装方式是填充结构目录

npm2

暴露问题:太深的目录树结构会严重影响效率,甚至在 Windows 下可能会超出系统路径限制的长度(复制粘贴删除就会报错)

  • npm3针对旧版本的解决方式
    • 会按照 package.json 里依赖的顺序依次解析,遇到新的包就把它放在第一级目录,后面如果遇到一级目录已经存在的包,会先判断版本,如果版本一样则忽略,否则会按照 npm2 的方式依次挂在依赖包目录下

npm3

更新包时,依然会产生结构冗余的问题,可通过dedupe整理包结构

npm dedupe
  • yarn 的优势
    • Resolution: 向仓库请求依赖关系
    • Fetching: 看看本地缓存了没有,否则把包拉到缓存里
    • Linking: 直接全部从缓存里构建好目录树放到 node_modules 里

参考:

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

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

  • 优势:代码的拆分与异步加载、对非 JavaScript 资源的支持等。强大的loader 设计使得它更像是一个构建平台,而不只是一个打包工具。
    • 模块规范:
      • 同时支持多种模块规范(AMD | CommonJS | UMD)
      • 通过使用loader,webpack也可以支持ES6 module(webpack2 原生支持)
      • 通过特定的插件实现 shim 后,在webpack 中,甚至可以把以最传统全局变量形式暴露的库当作模块require 进来。
    • 非javascript模块支持
      • 图片、.text 、.css ...
    • 构建产物
      • 不用类似Requirejs那样依赖AMD模块加载器(如Requirejs自身)
  • webpack 特色
    • 代码拆分(code splitting)
    • 智能的静态分析
    • 模块热替换(Hot Module Replacement)

参考:http://www.techug.com/post/webpack-requirejs-browserify.html

题目7:npm script是什么?如何使用?

npm 允许在package.json文件里面,使用scripts字段定义脚本命令。这些定义在package.json里面的脚本,就称为 npm 脚本

  • 用法: package.json文件中,通过定义scripts对象中的键值对来创建脚本内容
{
  // ...
  "scripts": {
    "build": "node build.js"
  }
}
  • note:
    • 由于执行npm 脚本时,会创建一个shell,且将当前目录的node_modules/.bin子目录加入PATH变量,执行结束后,再将PATH变量恢复原样。
    • 这意味着,当前目录的node_modules/.bin子目录里面的所有脚本,都可以直接用脚本名调用,而不必加上路径
    • 假如当前项目依赖里有Mocha,脚本内容直接写Mocha test就可以了 直接写模块名称
"test": "mocha test"

不用写成路径形式

"test": "./node_modules/.bin/mocha test"

参考:http://www.ruanyifeng.com/blog/2016/10/npm_scripts.html

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

替换地址

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

demo地址

题目10: 开发一个 node 命令行天气应用用于查询用户当前所在城市的天气,发布到 npm 上去。可以通过如下方式安装使用

下载使用

yongheng2016 avatar Aug 19 '17 11:08 yongheng2016