我想在客户端javascript应用程序中使用CommonJS模块系统。我选择nodejs作为实现,但找不到关于如何使用nodejs clientside的任何教程或文档,即不使用node application.js
我在html页面中包含了这样的node.js:
<script type="text/javascript" src="node.js"></script>
请注意,我没有在本地计算机上创建nodejs,无论如何我都在Windows上(我知道Cygwin选项)。
当我想在我自己的javascript中使用require
函数时,它说它未定义。
var logger = require('./logger');
我的问题是,是否可以使用这样的nodejs?
答案 0 :(得分:35)
github上的SubStack有一个名为node-browserify的模块。
它将压缩和捆绑您的模块并将其作为单个js文件提供,但您使用它就像Node.js一样(来自模块自述文件的示例):
<html>
<head>
<script type="text/javascript" src="/browserify.js"></script>
<script type="text/javascript">
var foo = require('./foo');
window.onload = function () {
document.getElementById('result').innerHTML = foo(100);
};
</script>
</head>
<body>
foo = <span style='font-family: monospace' id="result"></span>
</body>
</html>
从模块说明:
<强> Browserify 强>
浏览器端require()用于节点模块和npm包**
Browserify会在您指定的挂载点提前捆绑所有内容。这个ajaxy模块都没有加载业务。
更多功能:
- 递归捆绑npm模块的依赖关系
- 将es5-shim用于吸引
的浏览器- 过滤{min,ugl} ification
- 咖啡脚本也有效!
答案 1 :(得分:16)
答案 2 :(得分:15)
Node.js
是一个服务器端应用程序,您可以在服务器上运行javascript。您要做的是使用客户端上的require
功能。
最好的办法是自己编写require
方法或使用其他任何使用requireJS等语法的实现。
做了一些额外的研究后,似乎没有人使用commonJS语法为客户端编写了一个require模块。我将在不久的将来写下自己的作品,我建议你也这样做。
[编辑]
一个重要的副作用是require
函数是同步的,因此加载大量的javascript会完全阻止浏览器。这几乎总是一种不必要的副作用。如果你要这样做,你需要知道你在做什么。设置了requireJS语法,以便可以异步完成。
答案 3 :(得分:5)
关于RequireJS,可接受的答案是正确的。但是,快进到2020年,现在除IE <= 11之外,每个浏览器上几乎都有ES modules。
因此,回答您的问题“如何在客户端上使用node.js模块系统”。让我们从您已经可以利用ES模块这一事实开始,例如
<!DOCTYPE html>
<head>
<meta charset="utf-8" />
<title>Hello 2020</title>
<!-- load the app as a module, also use defer to execute last -->
<script type="module" src="./app.js"></script>
</head>
<html lang="en">
<body>
<div id="app">
<h1>Demo</h1>
</div>
</body>
</html>
app.js
import { hello } from './utils.js'
window.addEventListener('DOMContentLoaded', function (e) {
document.getElementsByTagName('h1')[0].innerText = hello('world');
});
util.js
function hello(text) {
return `$hello {text}`;
}
export { hello };
现在,让我们假设您要在浏览器中使用npm软件包(假设该软件包可以在浏览器和节点上运行)。在这种情况下,您可能要签出 Snowpack。
Snowpack 2.0是为这个网络新时代而设计的构建系统 发展。 Snowpack将捆绑程序从您的开发环境中删除, 利用本机ES模块(ESM)支持提供内置文件 直接到浏览器
换句话说,您可以使用npm软件包,从而允许您在客户端应用程序中使用“节点模块系统”。
答案 4 :(得分:3)
如果您想为具有与Node.js相同的样式模块的浏览器编写代码,请尝试Webmake。还可以通过以下方式查看应用程序构建的简单原型:SoundCloud Playlist Manager
答案 5 :(得分:1)
我建议使用Webpack,它可以自动执行节点模块的加载,依赖项,最小化等等。
要在项目中使用节点模块,请首先在计算机上安装node.js。软件包管理系统NPM应该在安装过程中安装。如果您已经安装了node.js,请将Node.js和NPM更新为最新版本。
在代码编辑器中打开您的项目,并在命令行中键入npm init -y
来初始化npm。接下来,通过键入npm install webpack webpack-cli --save-dev
在本地安装webpack。 (--save-dev
意味着这些依赖关系已添加到devDependencies
文件的package.json
部分,而生产不需要)
按照下面的树形结构来重建您的项目文件夹:
yourProjectName
|- package.json
|- /dist
|- index.html
|- /src
|- index.js
创建一个dist
文件夹以容纳所有分发文件,并将index.html
移至该文件夹。接下来,为所有源文件创建一个src
文件夹,并将js文件移动到该文件夹。您应使用与树结构中显示的完全相同的文件和文件夹名称。 (这是Webpack的默认设置,但您可以稍后通过编辑webpack.config.js
对其进行配置)
删除<script>
中的所有index.html
导入并将<script src="main.js"></script>
添加到</body>
标记之前。要导入其他节点模块,请在index.js
文件的开头添加import statements。例如,如果要导入lodash
,只需键入import _ from 'lodash';
,然后继续在_
文件中使用index.js
。
注意:不要忘了先将节点程序包安装到JS中。要在本地安装lodash
,请键入npm install lodash
。 Lodash将自动保存到package.json
最后,在命令行中输入npx webpack
来运行webpack。您应该会在main.js
文件夹中看到由Webpack为您生成的dist
。
以上指南仅提供使用Webpack的最基本方法。要探索更多有用的用例,请转到Webpack的official tutorial。它提供了有关资产管理,产出管理,开发和生产指南等主题的极其全面的教程。
答案 6 :(得分:0)
客户端有一个很好的需要node.js的库。它被称为包装。查看kamicane/wrapup