解决写node.js中遇到的问题
1.文件格式
1.1遇到的问题
用VS-code时新建文件选择javascript会生成**.mjs文件而不是.js文件
报错样式截图:
1.起初以为是没有import require.js库的原因,后来在node_module中找到了require.js的库,即排除了这一可能
2.后将问题解决的核心放在ESM上,可能没有加载到ES模块
将server.mis ->server.js
在所运行js文件的路径下
node server.js
就可以成功开放8088端口了
-Nodejs 中 ES Modules 使用
ES Modules基本使用
通过声明 .mjs 后缀的文件或在 package.json 里指定 type 为 module 两种方式使用 ES Modules,下面分别看下两种的使用方式:
使用方式一
构建如下目录结构
├── function.js
├── index.js
└── package.json
package.json
重点是将 type 设置为 module 来支持 ES Modules
{
"name": "esm-project",
"version": "1.0.0",
"main": "index.js",
"type": "module",
...
}
function.js
export function sayhello () {
console.log('hello from myself')
};
index.js
import {add} from './function.js';
console.log(sayhello());
在终端中运行
使用 ESM 运行时仍然会触发一个 experimental 警告信息。
$ n run v12.17.0 index.js
(node:6827) ExperimentalWarning: The ESM module loader is experimental.
hello from myself
$ n run v14.3.0 index.js
hello from myself
使用方式二
通过指定文件扩展名为 .mjs 与 CommonJS 模块进行区分,这样是不需要在 package.json 中指定 type 为 module
在上述例子基础上修改文件扩展名即可。
├── function.mjs
├── index.mjs
运行
$ n run v12.17.0 index.mjs
(node:6827) ExperimentalWarning: The ESM module loader is experimental.
hello from myself
模块导入导出的几种方式
exports导出
export 用于对外输出模块,可导出常量、函数、文件等,相当于定义了对外的接口,两种导出方式:
- export: 使用 export 方式导出的,导入时要加上 {} 需预先知道要加载的变量名,在一个文件中可以使用多次
- export default: 为模块指定默认输出,这样加载时就不需要知道所加载的模块变量名,一个文件中仅可使用一次
import导入
import 语句用于导入另一个模块导出的绑定,三种导入方式:
-
导入默认值:导入在 export default 定义的默认接口
-
as 别名导入:在导入时可以重命名在 export 中定义的接口
-
单个或多个导入:根据需要导入 export 定一个的一个或多个接口
import动态导入
可以像调用函数一样动态的导入模块,它将返回一个 Promise,但是这种方式需要 Top-Level await 支持
Top-Level await -
2.端口占用问题
第一次成功运行node.js之后,再去修改js文件,然后在运行,浏览器 (localhost:端口号)就加载很慢还加载不出来
显示已被监听也就是端口被占用了,有两个解决方案
- 开一个新的未打开端口
这个很简单但是不建议
- 关闭正在占用监听的端口
- 找到端口对应的进程号PID,然后终止进程
- 打开进程监控,在监控中找到对应端口应用并关闭
- 全局安装
sudo npm install -g xl_close_port
1,2对应的关闭端口方法太过于麻烦,所以第三种更高效便捷,在安装时如果出现报错建议用超级命令下安装
安装完毕后
➜ src xl_close_port -p 8088
[5] + 38081 killed node server.js
关闭端口 8088 成功!