NodeJS 和 NPM 模块

使用 rollup.js,我们也可以在 WasmEdge 上运行 CommonJS (CJS) 和 NodeJS (NPM) 模块。 simple_common_js_demo/npm_main.js 演示展示了它是如何工作的。它使用了第三方的 md5mathjs 模块。

  1. const md5 = require('md5');
  2. console.log('md5(message)=', md5('message'));
  3. const {sqrt} = require('mathjs');
  4. console.log('sqrt(-4)=', sqrt(-4).toString());

为运行上述代码,我们必须先使用 rollup.js 工具将所有依赖项构建到一个文件中。在此过程中,rollup.js 将 CommonJS 模块转换为 WasmEdge 兼容的 ES6 模块。构建脚本是 rollup.config.js

  1. const {babel} = require('@rollup/plugin-babel');
  2. const nodeResolve = require('@rollup/plugin-node-resolve');
  3. const commonjs = require('@rollup/plugin-commonjs');
  4. const replace = require('@rollup/plugin-replace');
  5. const globals = require('rollup-plugin-node-globals');
  6. const builtins = require('rollup-plugin-node-builtins');
  7. const plugin_async = require('rollup-plugin-async');
  8. const babelOptions = {
  9. 'presets': ['@babel/preset-react']
  10. };
  11. module.exports = [
  12. {
  13. input: './npm_main.js',
  14. output: {
  15. inlineDynamicImports: true,
  16. file: 'dist/npm_main.mjs',
  17. format: 'esm',
  18. },
  19. external: ['process', 'wasi_net','std'],
  20. plugins: [
  21. plugin_async(),
  22. nodeResolve(),
  23. commonjs({ignoreDynamicRequires: false}),
  24. babel(babelOptions),
  25. globals(),
  26. builtins(),
  27. replace({
  28. 'process.env.NODE_ENV': JSON.stringify('production'),
  29. 'process.env.NODE_DEBUG': JSON.stringify(''),
  30. }),
  31. ],
  32. },
  33. ];

package.json 文件指定了 rollup.js 依赖项和命令,以构建 npm_main.js 演示程序成一个包。

  1. {
  2. "dependencies": {
  3. "mathjs": "^9.5.1",
  4. "md5": "^2.3.0"
  5. },
  6. "devDependencies": {
  7. "@babel/core": "^7.16.5",
  8. "@babel/preset-env": "^7.16.5",
  9. "@babel/preset-react": "^7.16.5",
  10. "@rollup/plugin-babel": "^5.3.0",
  11. "@rollup/plugin-commonjs": "^21.0.1",
  12. "@rollup/plugin-node-resolve": "^7.1.3",
  13. "@rollup/plugin-replace": "^3.0.0",
  14. "rollup": "^2.60.1",
  15. "rollup-plugin-babel": "^4.4.0",
  16. "rollup-plugin-node-builtins": "^2.1.2",
  17. "rollup-plugin-node-globals": "^1.4.0",
  18. "rollup-plugin-async": "^1.2.0"
  19. },
  20. "scripts": {
  21. "build": "rollup -c rollup.config.js"
  22. }
  23. }

运行以下 NPM 命令将 npm_main.js 演示程序构建到 dist/npm_main.mjs 中。

  1. npm install
  2. npm run build

在 WasmEdge CLI 中运行结果 JS 文件,如下所示。

  1. $ wasmedge --dir .:. ../../target/wasm32-wasi/release/wasmedge_quickjs.wasm dist/npm_main.mjs
  2. md5(message)= 78e731027d8fd50ed642340b7c9a63b3
  3. sqrt(-4)= 2i

你可以通过这种方式在 WasmEdge 中导入和运行任何纯 JS NPM 包。