在客户端使用 npm 包
Use npm package on client side
有没有办法在客户端使用 npm 包?例如,我想在我的客户端 javascript 文件
中使用 dateformat
(https://www.npmjs.com/package/dateformat) 包
NPM 上的大多数包都是为服务器端设计的,出于安全原因不能在客户端运行。您可以使用 NW.js,但用户必须在该计算机上安装您的软件。
"NW.js (previously known as node-webkit) lets you call all Node.js modules directly from DOM and enables a new way of writing applications with all Web technologies."
http://nwjs.io/
如果您想在客户端上使用 npm,您可以考虑使用专为此目的而设计的 browserify。节点模块系统与浏览器不兼容,因此 browserify 将 javascript 转换为可以工作的东西。因此得名:browserify.
我发现使用 Browserify 还不够。客户端仍然存在无法从库中找到 variables/functions 的问题。
以下是对我有用的步骤:
安装 Browserify:
npm install -g browserify
从 npm 安装一个库(我将以 leader-line 为例):
npm i leader-line
您现在将在 node_modules 目录中拥有所有需要的 npm 文件:
现在我们可以运行使用常用的 Browserify 命令从 npm 包中打包 JS 文件:
browserify node_modules/leader-line/leader-line.min.js -o bundle.js
这将在 node_modules:
之外生成一个 bundle.js 文件
这是我们可以带入前端的文件,就像我们使用普通的 JS 库一样。
因此,假设我将我的 bundle.js 文件添加到 libs 文件夹,并将 bundle.js 重命名为 leaderline.js,我可以简单地在我的 index.html
文件:
<script src="libs/leaderline.js" type="module"></script>
注意脚本标签中添加了 type="module"
。
然而,这还不够。最后一步是打开库的 JS 文件(在我的例子中 leaderline.js)并找到需要导出的主要函数(通常在顶部附近的某个地方):
var LeaderLine=function(){"use strict";var te,g,y,S,_,o,t,h,f,p,a,i,l,v="leader-line"
我需要在我的脚本中使用 LeaderLine。为了实现这一点,我们只需删除 var
并在函数名称前添加 window.
,如下所示:
window.LeaderLine=function(){"use strict";var te,g,y,S,_,o,t,h,f,p,a,i,l,v="leader-line"
现在我可以毫无问题地使用库客户端了:
HTML:
<div id="start">start</div>
<div id="end">end</div>
JS
new LeaderLine(
document.getElementById('start'),
document.getElementById('end')
);
有些人会争辩说,将函数公开给 window 对于最佳实践而言过于“全局”。但另一种选择是使用模块捆绑器,它处理包的暴露,这对许多应用程序来说是过大的杀伤力,特别是如果你想快速组装一个前端来尝试一些东西。
我觉得很奇怪,现在这么多人在 npm 中发布包,这些包显然是为前端准备的(例如,显然没有人会在后端节点中使用 leaderline.js,但这是包所在的位置已发布,没有可用的 CDN)。
鉴于从 npm 包中公开前端功能是多么曲折,可以说今天的 JS 生态系统一团糟。
有没有办法在客户端使用 npm 包?例如,我想在我的客户端 javascript 文件
中使用dateformat
(https://www.npmjs.com/package/dateformat) 包
NPM 上的大多数包都是为服务器端设计的,出于安全原因不能在客户端运行。您可以使用 NW.js,但用户必须在该计算机上安装您的软件。
"NW.js (previously known as node-webkit) lets you call all Node.js modules directly from DOM and enables a new way of writing applications with all Web technologies." http://nwjs.io/
如果您想在客户端上使用 npm,您可以考虑使用专为此目的而设计的 browserify。节点模块系统与浏览器不兼容,因此 browserify 将 javascript 转换为可以工作的东西。因此得名:browserify.
我发现使用 Browserify 还不够。客户端仍然存在无法从库中找到 variables/functions 的问题。
以下是对我有用的步骤:
安装 Browserify:
npm install -g browserify
从 npm 安装一个库(我将以 leader-line 为例):
npm i leader-line
您现在将在 node_modules 目录中拥有所有需要的 npm 文件:
现在我们可以运行使用常用的 Browserify 命令从 npm 包中打包 JS 文件:
browserify node_modules/leader-line/leader-line.min.js -o bundle.js
这将在 node_modules:
之外生成一个 bundle.js 文件这是我们可以带入前端的文件,就像我们使用普通的 JS 库一样。
因此,假设我将我的 bundle.js 文件添加到 libs 文件夹,并将 bundle.js 重命名为 leaderline.js,我可以简单地在我的 index.html
文件:
<script src="libs/leaderline.js" type="module"></script>
注意脚本标签中添加了 type="module"
。
然而,这还不够。最后一步是打开库的 JS 文件(在我的例子中 leaderline.js)并找到需要导出的主要函数(通常在顶部附近的某个地方):
var LeaderLine=function(){"use strict";var te,g,y,S,_,o,t,h,f,p,a,i,l,v="leader-line"
我需要在我的脚本中使用 LeaderLine。为了实现这一点,我们只需删除 var
并在函数名称前添加 window.
,如下所示:
window.LeaderLine=function(){"use strict";var te,g,y,S,_,o,t,h,f,p,a,i,l,v="leader-line"
现在我可以毫无问题地使用库客户端了:
HTML:
<div id="start">start</div>
<div id="end">end</div>
JS
new LeaderLine(
document.getElementById('start'),
document.getElementById('end')
);
有些人会争辩说,将函数公开给 window 对于最佳实践而言过于“全局”。但另一种选择是使用模块捆绑器,它处理包的暴露,这对许多应用程序来说是过大的杀伤力,特别是如果你想快速组装一个前端来尝试一些东西。
我觉得很奇怪,现在这么多人在 npm 中发布包,这些包显然是为前端准备的(例如,显然没有人会在后端节点中使用 leaderline.js,但这是包所在的位置已发布,没有可用的 CDN)。
鉴于从 npm 包中公开前端功能是多么曲折,可以说今天的 JS 生态系统一团糟。