1.如何全局安装一个 node 应用?
每个模块可以“全局安装”,也可以“本地安装”。
“全局安装”指的是将一个模块安装到系统目录中,各个项目都可以调用。一般来说,全局安装只适用于工具模块,比如eslint和gulp。例如:/user/local/bin/目录下。
“本地安装”指的是将一个模块下载到当前项目的node_modules子目录,然后只有在项目目录之中,才能调用这个模块。例如:./node-modules/
本地安装
npm install <package name>
卸载:npm uninstall -g XXX
全局安装
npm install -g <package name
2.package.json 有什么作用?
npm init命令生成package.json文件,这个文件定义了项目所需的各种模板及相关配置信息(比如名称、版本、许可证等元数据)。npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
{
"name": "cover_md", //项目名称
"version": "1.0.6", //项目版本号
"description": "一个 markdown 转 html 的小工具", //入口文件
"main": "index.js", //指定了加载的入口文件,require('moduleName')就会加载这个文件。这个字段的默认值是模块根目录下面的index.js
"bin": {
// bin参数是{ 命令名:文件名 }的格式,指定了各个内部命令对应的可执行文件的位置,相当于在user/local/bin下创建一个快捷方式,映射到对应的文件,执行所映射的文件
// 执行`convert`命令时,将运行对应文件(./bin/server)
// ./bin/convert文件头部需添加 #!/usr/bin/env node, 表示将以node运行这个文件
"convert": "./bin/convert"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"start" : "node app.js" //执行当前目录下app.js
//一般默认一个test的空文件夹、用作写测试代码,`npm test`即可运行。
//自定义的命令名需加run才能与运行,`npm run make`
},
"keywords": [ //关键字,是一个字符串的数组,也有助于人们在npm搜索你的包
"markdown",
"html",
"convert"
],
"author": "wcon", //作者名称
"license": "ISC", //协议
"repository": {
"type": "git", //该包在github上的代码托管仓库地址
"url": "git+https://github.com/wcongratulation/markdow.git"
},
"dependencies": { // 正式使用时依赖的包, npm install --save xxx 生成
"my_dep": "^1.0.0"
},
"devDependencies" : { //开发或者测试时,依赖的包。npm install --save-dev xxx生成
"my_test_framework": "^3.1.0"
}
"bugs": {
"url": "https://github.com/wcongratulation/markdow/issues" //一个对象,包含url网址和邮箱,当使用者发现问题时,可以通过这两种方式提交问题
},
"homepage": "https://github.com/wcongratulation/markdow#readme" //主页,项目主页的地址
}
3.npm install --save app 与 npm install --save-dev app有什么区别?
如果将node_modules文件夹删掉,则执行npm install默认会安装dependencies字段和devDependencies字段中的所有模块。
这两条命令都会下载app到node_modules文件夹下面,不同之处在于:
npm install --save app:模块名app将被添加到package.json下的dependencies。
npm install --save-dev app:模块名app将被添加到package.json下的devDependencies。
此外:dependencies下的模块,是我们生产环境中需要的依赖,devDependencies只用于开发阶段完成集成测试等功能模块依赖。因此,执行npm install server-mock时,只会下载它依赖层级dependencies下的模块,而不会下载devDependencies的模块,需要手动下载。
4.node_modules的查找路径是怎样的?
1.如果require的内容以./或者../开头的按照正常的查找路径。
2.require内容不加./或者../查找的js文件。比如需要查找的依赖包叫“easytpl”,它会先在当前目录下查找node_module, 看有没有easytpl文件夹(即easytpl包),如果有的话,会读取easytpl文件夹下的package.json,找到里面的main参数,加载main里对应的路径的文件。如果当前目录下没有node_module,或当前目录下的node_module没找到easytpl,便向上级目录中查询,直到系统根目录。
3.node全局安装在系统根目录下,所以全局安装后可在所有目录下使用。
如果当前文件是'/home/ry/projects/foo.js' 然后require('bar.js'), 那么node将会按照以下路径查找
/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和npm3有一个很大的区别, 就是组织包的结构. npm2组织依赖的包是按照树形组织的. npm3将其改进为扁平结构。
npm2会将所依赖的包存放到当前目录的./node_modules/目录下. 而被安装的包又会依赖其他的包的话, 则会存放到该包的./node_modules下. 所以, 当依赖结构很复杂的时候, 目录结构会非常深. 不管是性能还是操作上, 体验都不怎么好。
而在npm3中, 采用扁平的目录结构, 二级依赖会放到当前目录的node_modules的里, 与一级包在同一目录。
例如:
比如,有一个模块A,依赖 B。npm3会将模块B放置到与A同级目录下,而npm2会将B放置到A的依赖模块目录下
npm2,一个 App 里模块 A 和 C 都依赖B,无论被依赖的 B 是否是同一个版本,都会生成对应结构。
npm3,npm install 时会按照 package.json 里依赖的顺序依次解析,遇到新的包就把它放在第一级目录,后面如果遇到一级目录已经存在的包,会先判断版本,如果版本一样则忽略,否则会按照 npm2 的方式依次挂在依赖包目录下
npm3也存在开发环境和测试环境的 node_modules 目录结构不一样以及其他的问题,因此FaceBook搞了 yarn 用来替代 npm
- 快速—会缓存已经下载过的包,避免重复下载
- 安全 — 下载前会检查签名及包的完整性
yarn 构建步骤如下:
- Resolution: 向仓库请求依赖关系
- Fetching: 看看本地缓存了没有,否则把包拉到缓存里
- Linking: 直接全部从缓存里构建好目录树放到 node_modules 里
参考 npm2 npm3 yarn 的故事
6.webpack是什么?和其他同类型工具比有什么优势?
WebPack是一个模块化加载器兼打包工具,它同时支持AMD、CMD等加载规范。
它能够打包WebHTML、js、CSS以及各种静态文件(图片、字体等)。
对于不同类型的资源,webpack有对应的模块加载器。
webpack模块打包器会分析模块间的依赖关系,最后 生成了优化且合并后的静态资源。
优势:
1.代码分割:按需加载模块
2.Loaders:通过加载器我们可以将其他类型的资源转换为JS输出
3.webpack提供了强大的插件系统,当webpack内置的功能不能满足我们的构建需求时,我们可以通过使用插件来提高工作效率。因为它可以加载几乎所有的第三方库
7.npm scripts 是什么?如何使用?
npm script 是 package.json 中的一个属性
可以在这个属性中自定义 npm 命令,输入这个命令就会执行指定的操作
如:
// 在 package.json 中
{
...
'script': {
'create': 'mkdir app'
}
...
}
// 在命令行中输入:
$ npm run create
// 就会运行指令 mkdir app, 表示创建一个文件app