> 웹 프론트엔드 > JS 튜토리얼 > Nodejs의 모듈 사양에 대한 간략한 토론

Nodejs의 모듈 사양에 대한 간략한 토론

青灯夜游
풀어 주다: 2021-06-09 10:47:50
앞으로
2052명이 탐색했습니다.

이 글은 Nodejs의 모듈 사양에 대해 자세히 설명합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

Nodejs의 모듈 사양에 대한 간략한 토론

모듈 사양은 대규모 Node.js 애플리케이션을 구축하는 기초이므로 매우 중요합니다. Node.js 모듈 사양은 CommonJS 모듈 사양이기도 합니다. [추천 학습: "nodejs Tutorial"]

CommonJS 모듈 사양

예전에는 JS 파일을 로드하는 유일한 방법이 <script></script> 태그를 통해서였습니다. 이걸로? <script></script> 标签引入,这个会有什么问题呢?

  • 脚本变多时,需要手动管理加载的顺序;脚本越多就越难管理。
  • 不同脚本之间的逻辑调用,需要通过全局变量的方式。
  • 没有 html 的时候怎么引用 JS 文件呢?这个例子就是 Node.js。

于是 Node.js 就有了 CommonJS 模块规范,而 Webpack 也是兼容了 CommonJS 的写法,让我们可以用 CommonJS 规范来写前端代码。

CommonJS 模块规范是 JavaScript 社区发起的,它在 Node.js 上得到应用并推广,后续也影响到了浏览器端 JavaScript。

require

require 是 CommonJS 模块规范的 API,用来引入要使用的文件。比如引入 lib.js

require(&#39;./lib&#39;);
로그인 후 복사

require 默认返回一个空对象;新建两个文件,文件内容如下:

// lib.js
console.log('this is lib');

// index.js
console.log('start require')
var lib = require(&#39;./lib&#39;); // 默认返回一个空对象
console.log('end require', lib);
로그인 후 복사

来运行看看:node index.js

Nodejs의 모듈 사양에 대한 간략한 토론

它也是可以通过 exports 来挂载一些属性的:字符串、函数、对象等类型的数据。

lib.js 添加一些代码

console.log(&#39;this is lib&#39;)

exports.hello = "world"
exports.add = function (a, b) {
  return a + b;
}
exports.obj = { hello: "Node" }
로그인 후 복사

Nodejs의 모듈 사양에 대한 간략한 토론

看来在 CommonJS 模块规范下,它是默认有一个 exports 这样的空对象的。

那既然 require 返回这样一个对象,那么修改和添加其中的属性会怎么样呢?

// index.js
// 既然 require 返回一个对象,那么修改和添加属性会怎么样呢?
lib.hello = &#39;node&#39;;
lib.update = &#39;1234&#39;;
로그인 후 복사
// lib.js
setTimeout(function() {
  console.log(exports)
}, 500)
로그인 후 복사

Nodejs의 모듈 사양에 대한 간략한 토론

可以看到,在 lib.js 加了一个 500ms 之后打印的内容是改变了的。所以通过 exports 输出的时候要注意这个拷贝的问题。可能有些同学会看到过这样的一段话:CommonJS 模块输出的是一个值的浅拷贝,ES6 模块输出的是值的引用。那么这是怎么回事呢?

原来 require 还可以通过 module.exports 的方式返回数据,而且数据类型是不限的,例如返回一个函数:

// lib.js
console.log(&#39;this is lib&#39;)

exports.hello = "world"
exports.add = function (a, b) {
  return a + b;
}
exports.obj = { hello: "Node" }
// setTimeout(function() {
//   console.log(exports)
// }, 500)
module.exports = function minus(a, b) {
  return a - b;
}
로그인 후 복사

Nodejs의 모듈 사양에 대한 간략한 토론

可以看到:lib 返回输出的 minus 函数。

require 一个模块时,module.exports 的优先级要高于 exports,如果指定了 module.exports,那么就会使用 module.exports 指定的对象,如果没有指定 module.exports,就会使用 exports 对象。

npm

npm 相信大家都不陌生,那这里就只是简单介绍一下吧。

npm 是 Node.js 的包管理工具,安装 Node.js 的时候都会自带有 npm 的。而包则是别人写的 Node.js 模块,我们平时开发都会经常用到一些别人开发出来放到 Node.js 服务器上面的包。

npm 初始化:npm init,初始化的时候一直回车就好,之后会生成一个 package.json 文件;或者执行命令 npm init -y,这样就是生成一个默认的 package.json 文件,里面的属性和执行 npm init 一直回车是一样的。

Nodejs의 모듈 사양에 대한 간략한 토론

package.json

  • 스크립트가 많을수록 로딩 순서를 수동으로 관리해야 합니다.
  • 다른 스크립트 간의 논리적 호출은 전역 변수를 통해 수행되어야 합니다.
  • html이 없을 때 JS 파일을 참조하는 방법은 무엇입니까? 이 예는 Node.js입니다.

그래서 Node.js에는 CommonJS 모듈 사양이 있고 Webpack도 CommonJS 작성 방법과 호환되므로 CommonJS 사양을 사용하여 프런트엔드 코드를 작성할 수 있습니다. 🎜🎜CommonJS 모듈 사양은 JavaScript 커뮤니티에서 시작되었으며 Node.js에 적용 및 승격되었으며 이후 브라우저 측 JavaScript에 영향을 미쳤습니다. 🎜

🎜require🎜🎜🎜require는 사용할 파일을 소개하는 데 사용되는 CommonJS 모듈 사양의 API입니다. 예를 들어, import lib.js: 🎜
{
  "name": "node",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
로그인 후 복사
로그인 후 복사
🎜require는 기본적으로 빈 객체를 반환합니다. 다음 콘텐츠로 두 개의 새 파일을 만듭니다. 🎜
npm install -g cnpm --registry=https://registry.npm.taobao.org
로그인 후 복사
로그인 후 복사
🎜실행해 보겠습니다. 코드> 노드 index.js🎜🎜1 .png🎜🎜내보내기를 통해 일부 속성(문자열, 함수, 개체 및 기타 유형의 데이터)을 마운트할 수도 있습니다. 🎜🎜lib.js🎜
npm install express --registry=https://registry.npm.taobao.org
로그인 후 복사
로그인 후 복사
🎜Nodejs의 모듈 사양에 대한 간략한 토론🎜🎜CommonJS 모듈 사양에서는 기본적으로 exports와 같은 빈 개체가 있는 것 같습니다. 🎜🎜그러면 require는 이러한 객체를 반환하므로 해당 객체의 속성을 수정하고 추가하면 어떻게 될까요? 🎜rrreeerrreee🎜Nodejs의 모듈 사양에 대한 간략한 토론🎜🎜 lib.js500ms를 추가하면 인쇄된 내용이 변경된 것을 확인할 수 있습니다. 따라서 내보내기를 통해 내보낼 때 이 복사 문제에 주의해야 합니다. 일부 학생들은 다음 단락을 보았을 것입니다. 🎜CommonJS 모듈은 값의 얕은 복사본을 출력하는 반면 ES6 모듈은 값에 대한 참조를 출력합니다🎜. 그래서 무슨 일이야? 🎜🎜requiremodule.exports를 통해 데이터를 반환할 수도 있으며 데이터 유형은 제한되지 않습니다. 예를 들어 🎜rrreee🎜Nodejs의 모듈 사양에 대한 간략한 토론🎜🎜볼 수 있는 내용: < code>lib 출력을 반환하는 minus 함수입니다. 🎜🎜즉, 모듈을 require할 때 module이 지정되면 <code>module.exportsexports🎜보다 우선순위가 높습니다. module.exports가 지정되지 않으면 exports가 사용됩니다. 사용되었습니다. 🎜

🎜npm🎜🎜🎜npm 다들 잘 아실 거라 생각해서 간단히 소개하겠습니다. 🎜🎜npm은 Node.js를 설치할 때 npm과 함께 제공되는 패키지 관리 도구입니다. 패키지는 다른 사람이 작성한 Node.js 모듈입니다. 일상적인 개발에서 우리는 종종 다른 사람이 개발하여 Node.js 서버에 배치한 일부 패키지를 사용합니다. 🎜🎜npm 초기화: npm init, 초기화 중에 Enter 키를 누르면 package.json 파일이 생성되거나 명령이 실행됩니다. npm init -y, 그러면 기본 package.json 파일이 생성됩니다. 내부 속성은 npm init를 실행하고 Enter를 누르는 것과 동일합니다. 🎜🎜Nodejs의 모듈 사양에 대한 간략한 토론🎜🎜< code>package.json 파일의 내용은 다음과 같습니다. 🎜
{
  "name": "node",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}
로그인 후 복사
로그인 후 복사
  • 下载安装依赖包 <packageName>npm install <packageName>;如果想要全局安装则添加 -gnpm install <packageName> -g。如安装 glob 包:npm install glob
  • 卸载依赖包的命令是 npm uninstall <packageName>

比如安装 express 包,安装成功会生成一个 node-modules 文件夹,我们下载的包就放在这个文件里面:

Nodejs의 모듈 사양에 대한 간략한 토론

如果使用 npm 安装依赖包的速度很慢,可以使用淘宝镜像 cnpm 来安装,镜像是指它把国外 npm 的包做一层复制然后映射到国内的服务器上面,这样不用山长水远去国外拉包,速度会快很多。

安装 cnpm

npm install -g cnpm --registry=https://registry.npm.taobao.org
로그인 후 복사
로그인 후 복사

cnpm 的使用和 npm 类似:cnpm install <packageName>

那如果你觉得 cnpm 不够正宗,不想长期使用,但有些包下载又确实慢了,可以临时使用镜像,比如安装 express

npm install express --registry=https://registry.npm.taobao.org
로그인 후 복사
로그인 후 복사

--registry= 是指定下载地址的意思,例如一些公司可能有自己的依赖包服务器,那么可以通过将这个地址指向公司的服务器地址来更快的下载依赖包。

cnpm 本身其实是 npm 的一个别名,使用 cnpm 的时候会自动帮我们加上后面的参数 --registry=https://registry.npm.taobao.org,然后通过镜像地址来下载依赖包。

另外,npm 使用遇到问题可以登录 官网 寻找解决办法:

Nodejs의 모듈 사양에 대한 간략한 토론

总结

  • Node.js 的模块规范就是 CommonJS 模块规范。
  • CommonJS 模块规范通过 require() 加载模块,默认返回一个对象,可以通过设置 exportsmodule.exports 设置模块返回的数据。
  • Node.js 的包管理工具是 npm,可通过使用镜像 cnpm 来提高下载速度。

更多编程相关知识,请访问:编程视频!!

위 내용은 Nodejs의 모듈 사양에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿