浏览器和 Node.js 中的 ES Module

之前一直以为浏览器和 Node.js 都是不支持 ES Module 的,所以需要借助 Webpack 打包。

浏览器中的 ESM

随着 Snowpack 、Vite 为代表的 bundless 构建工具的兴起,浏览器 ESM 开始被越来越多人熟知。Chrome 63 开始就支持了浏览器原生 ESM :

在这里插入图片描述
使用浏览器原生 ESM ,需要在 script 标签上加 type="module" 即可开启:

<script type="module">
import { logger } from "./utils.js";

logger("2333");
</script>

utils.js 内容如下:

export function logger(param) {
  console.log(param);
}

Node.js 中的 ESM

现在很多人写 Node.js 还在用 CommonJS ,实际上 Node.js 也是支持 ESM 的。如果你看过一些 npm 包的源码,你可能会看到一些 .mjs.cjs 的文件,这实际上就和 Node.js 的模块规范有关,下面来解释下。

Node.js 默认支持 CommonJS ,如果要使用 ES6 模块则需要将文件后缀名改为 .mjs ,可以在里面放心使用 ESM 。如果不希望将后缀改为 .mjs ,则需要在项目的 package.json 中指定 type 字段为 module

{
	"type": "module",
}

在修改 package.json 之后,如果还要使用 CommonJS 模块,则需要将文件后缀名改为 .cjs

总结为一句话:.mjs 文件总是以 ES6 模块加载,.cjs 文件总是以 CommonJS 模块加载,.js 文件的加载取决于 package.json 里面 type 字段的设置。如果没有 type 字段,或者的 type 字段为 commonjs ,则 .js 脚本会被解释成 CommonJS 模块。

另外在 Node.js 中使用 ESM ,引入的模块一定要带上文件后缀,这点不是很友好:

import { logger } from "./utils.js";

logger("2333");

在 Webpack 等打包构建工具中可以省略后缀

本人用 Node.js 写了一个简单的 http 服务,无论内置模块还是自定义模块,都可以使用 ESM :

import http from "http";
import { logger } from "./utils.js";

const app = http.createServer((req, res) => {
  req.pipe(res);
});

app.listen(3000, () => {
  logger("Server running on: http://localhost:3000");
});

参考:

Node.js 如何处理 ES6 模块

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 TypeScript 使用 Webpack 可以通过以下步骤来实现在浏览器使用 Node.js 的一些全局对象和方法: 1. 安装依赖:首先需要安装 `webpack` 和 `webpack-cli` 两个依赖。 ``` npm install webpack webpack-cli --save-dev ``` 2. 配置 TypeScript 编译选项:在 `tsconfig.json` 文件,需要将 `target` 选项设置为 `es5` 或更高版本,以支持一些新的 JavaScript 特性。同时,需要将 `module` 选项设置为 `commonjs`,以支持 Node.js 的模块化规范。 ```json { "compilerOptions": { "target": "es5", "module": "commonjs" } } ``` 3. 配置 Webpack:在根目录下创建一个 `webpack.config.js` 文件,用于配置 Webpack。 ```javascript const path = require('path'); module.exports = { mode: 'development', entry: './src/index.ts', output: { filename: 'bundle.js', path: path.resolve(__dirname, 'dist') }, resolve: { extensions: ['.ts', '.js'] }, module: { rules: [ { test: /\.ts$/, use: 'ts-loader', exclude: /node_modules/ } ] } }; ``` 上述配置文件,`entry` 选项指定了入口文件,`output` 选项指定了打包后的文件名和文件路径,`resolve` 选项指定了可以省略的文件扩展名,`module` 选项的 `rules` 字段指定了处理 TypeScript 文件的 loader。 4. 安装 `ts-loader`:在命令行执行以下命令来安装 `ts-loader`。 ``` npm install ts-loader --save-dev ``` 5. 编写代码:在 `src` 目录下编写 TypeScript 代码,使用 Node.js 的全局对象和方法。 ```typescript import fs from 'fs'; const data = fs.readFileSync('test.txt', 'utf8'); console.log(data); ``` 上述代码使用了 Node.js 的 `fs` 模块来读取文件,并且使用了 `console.log` 方法来输出数据。 6. 打包代码:在命令行执行以下命令来打包代码。 ``` npx webpack ``` 执行完毕后,会在 `dist` 目录下生成一个 `bundle.js` 文件,可以在浏览器加载使用。需要注意的是,在浏览器使用 Node.js 的全局对象和方法时,需要确保这些方法在浏览器的兼容性和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值