JavaScript不使用任何包,如何实现功能?

摘要:前言 除了古老的 CC++,几乎所有的编程语言都有模块系统,都有官方的包管理器。我们一般不自己实现所有的代码,实际应用开发过程中大量使用开源库和框架。这篇文章演示了如何把自己实现的库变成一个包,一个包就
前言 除了古老的 C/C++,几乎所有的编程语言都有模块系统,都有官方的包管理器。我们一般不自己实现所有的代码,实际应用开发过程中大量使用开源库和框架。这篇文章演示了如何把自己实现的库变成一个包,一个包就是你的应用,也是你的库。 随着程序越来越大,我们会将不同用途的代码放到不同的源文件。为了代码共享,我们会将部分代码提出来作为一个库。如果我们的项目越来越复杂的话,就会既有库又有可执行程序。如何组织项目的代码,如何理解一个复杂项目的代码结构。只需要掌握两点: 理解语言本身的模块或包的机制 理解包管理器或构建系统如何构建库/程序 JavaScript 语言本身没有包 JavaScript 的包不是一个语言层面的概念,是包管理器层面的概念。换句话说,JavaScript 语言本身没有包,包是 npm 的特性,让你构建、测试、分享 JS 模块。 JavaScript 只有模块,一个 .js 文件就是一个 JavaScript 模块。 JavaScript 的模块相当于是 Go 语言里面的包,只不过 Go 语言的包可以是单个目录下的多个 .go 文件。 Go语言的代码通过包(package)组织,包类似于其它语言里的库 (libraries)或者模块(modules)。一个包由位于单个目录下的一个或多个.go源代码文件组成, 目录定义包的作用。每个源文件都以一条 package 声明语句开始,这个例子里就 是 package main , 表示该文件属于哪个包,紧跟着一系列导入(import)的包,之后是存储在 这个文件里的程序语句。 npm 包 BTW:Rust 也和 JavaScript 一样,Rust 语言本身没有包的概念,Rust 语言本身只有 Crate 和 Module。Rust 的 Module 是命名空间也是把代码分离到不同的源文件。Cargo 的包只能有一个 Library Crate,可以有多个 Binary Crate。rustc 一次考虑一个 crate。 node 一次考虑一个 JS 模块,node script.js 运行一个 JS 模块。npm 包只能有一个库,可以有多个可执行脚本。库的名字是 package.json 中的 name,这也是包的名字,"main" 字段是这个库的入口。一个库也是一个包,package.json 描述了一个包。 我们来创建一个包,并使用它。 npm init 创建一个 JavaScript 的包,即创建 package.json。创建 greeting mkdir greeting cd greeting npm init -y 我们要修改 package.json,type: module 告诉 NodeJS 这个包的 JS 文件都是 ES 模块。greeting 的用户要使用 import 来导入包或者模块就必须做这个修改。 --- i/package.json +++ w/package.json @@ -2,6 +2,7 @@ "name": "greeting", "version": "1.0.0", "main": "index.js", + "type": "module", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, main: index.js 是这个包的入口,我们要创建这个 index.js。index.js 是默认的 main,我们可以自定义 main。 // Filename: index.js export function hello(name) { return `Hi, ${name}. Welcome!` } 这样我们就建立好了一个 JavaScript 的包,这个包提供一个 hello 函数。 创建一个名为 hello 的包,使用 greeting 这个包。 mkdir hello cd hello npm init -y 创建 hello 包后目录结构如下 <home>/ ├── greeting │ ├── index.js │ └── package.json └── hello └── package.json 使用 greeting,我们就要安装这个包,在 hello 文件夹下执行: npm i ../greeting 安装 greeting 包,npm 创建了一个 node_modules 目录,把 greeting 的代码放到了 node_modules。
阅读全文