使用浏览器化节点应用程序访问 module.exports
Accessing module.exports with a browserified node app
我们正在尝试浏览我们的节点应用程序
样本文件(index.js)
module.exports = {
index: () => 'test',
};
浏览器化命令
browserify src/index.js > dist/bundle.js --node
如果我们使用一个文件来要求和控制台
console.log(require('src/index')); // { index: [Function: index] }
console.log(require('dist/bundle')); // { }
我们的预期是 bundle.js 会导出与 index.js 相同的结果。
谁能指出我们做错了什么或遗漏了什么?
附加信息
~这不是我们的应用程序,这是一个演示问题的示例
我们目前正在将我们的整个应用程序压缩到 AWS Lambda,入口点 src/index.index
并且 objective 只是发送 bundle.js 文件并且能够拥有入口点 bundle.index
bundle.js
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
module.exports = {
index: () => 'test',
};
},{}]},{},[1]);
您可以使用 serverless 来实现,非常容易配置。无需为此使用 browserify
cli。
继续按照以下官方文档设置serverless
cli。
一切设置完成后,您就可以使用无服务器 cli 将 lambda 函数部署到 AWS。按照以下步骤设置 browserify。
- 安装
browserify
作为开发依赖项。
- 安装
serverless-plugin-browserifier
作为开发依赖项。
将插件添加到您的 serverless.yml
文件并设置 package.individually to true
。 (Ref)
plugins:
- serverless-plugin-browserifier
package:
individually: true
注:亲自试过,效果不错。
您需要使用 --standalone
标志。如果我重现您在问题中描述的设置并执行:
$ browserify src/index.js --standalone mylib > dist/bundle.js
然后我可以 运行 在其上进行交互式 Node 会话,并按照您期望的方式使用该库:
$ node
> require("./dist/bundle").index()
'test'
--standalone
标志告诉 Browserify 将您的代码包装在 UMD stub 中,这允许将包加载为 CommonJS 模块、AMD 模块或纯脚本(即不使用模块系统)。您通过 --standalone
传递的参数指示您的库在 "plain script" 情况下将采用什么名称。所以在上面的例子中,如果你要在没有任何模块系统的浏览器中加载库,你可以 运行 index
as mylib.index()
.
我们正在尝试浏览我们的节点应用程序
样本文件(index.js)
module.exports = {
index: () => 'test',
};
浏览器化命令
browserify src/index.js > dist/bundle.js --node
如果我们使用一个文件来要求和控制台
console.log(require('src/index')); // { index: [Function: index] }
console.log(require('dist/bundle')); // { }
我们的预期是 bundle.js 会导出与 index.js 相同的结果。
谁能指出我们做错了什么或遗漏了什么?
附加信息
~这不是我们的应用程序,这是一个演示问题的示例
我们目前正在将我们的整个应用程序压缩到 AWS Lambda,入口点 src/index.index
并且 objective 只是发送 bundle.js 文件并且能够拥有入口点 bundle.index
bundle.js
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
module.exports = {
index: () => 'test',
};
},{}]},{},[1]);
您可以使用 serverless 来实现,非常容易配置。无需为此使用 browserify
cli。
继续按照以下官方文档设置serverless
cli。
一切设置完成后,您就可以使用无服务器 cli 将 lambda 函数部署到 AWS。按照以下步骤设置 browserify。
- 安装
browserify
作为开发依赖项。 - 安装
serverless-plugin-browserifier
作为开发依赖项。 将插件添加到您的
serverless.yml
文件并设置package.individually to true
。 (Ref)plugins: - serverless-plugin-browserifier package: individually: true
注:亲自试过,效果不错。
您需要使用 --standalone
标志。如果我重现您在问题中描述的设置并执行:
$ browserify src/index.js --standalone mylib > dist/bundle.js
然后我可以 运行 在其上进行交互式 Node 会话,并按照您期望的方式使用该库:
$ node
> require("./dist/bundle").index()
'test'
--standalone
标志告诉 Browserify 将您的代码包装在 UMD stub 中,这允许将包加载为 CommonJS 模块、AMD 模块或纯脚本(即不使用模块系统)。您通过 --standalone
传递的参数指示您的库在 "plain script" 情况下将采用什么名称。所以在上面的例子中,如果你要在没有任何模块系统的浏览器中加载库,你可以 运行 index
as mylib.index()
.