我遇到了几个使用这个require()函数的JavaScript项目和库,以便包含其他文件,如下所示:
require('somefile')
我从来没有听说过,显然它是node.js的东西,我没有,也没有用过。
我打算在我自己的网站上使用这些JavaScript库,但我看到了涉及" npm"的所有类型的指令。 (无论可能是什么)。然后有一个名为required.js的替换,但似乎使用了不同的语法,比如强制使用require([...])或者其他东西,而我需要包含的项目只需要(。 ..)。
在常规html5网站中使用JavaScript项目时,最简单的处理这个问题的方法是什么? (即所有应该运行客户端)
另外:我已经尝试过require.js,但它似乎没有用。例如,somelibrary.js中的第一行是:
var assert = require('assert')
当我之前包含require.js,然后是somelibrary.js时,我收到此错误:
未捕获的异常:错误:模块名称"断言"尚未加载 但对于上下文:_。使用require([])
包含require()
的任何内容都会发生这种情况另外一个补充:我注意到有人提到浏览器'。我试图包含的一些js项目也推荐这个。显然,这应该生成一个我可以包含的单个即用型.js文件。但是
为什么他们不直接发布这个浏览器化的.js?有什么理由我需要自己编译吗?它应该是所有浏览器或网站的通用产品,对吧?
这个浏览器化的东西,显然是为了避免node.js,实际上似乎需要node.js本身(所有提及的指令" npm -g install browserify"等等)
答案 0 :(得分:1)
理想情况下,图书馆应根据其环境支持以下内容。假设您正在使用名为" MyLib.js"。
的库未检测到模块加载程序
window.MyLib
检测到需要
define(['MyLib'], function (MyLib) {
// Do something
return {};
});
检测到CommonJS,如节点或使用browserify或bower
var MyLib = require('MyLib');
并非所有的lib都符合这一点,但他们应该这样做。也许您正在查看的lib只支持Node。看看jQuery的源代码,你会看到类似这样的东西:
if ( typeof module === "object" && typeof module.exports === "object" ) {
// For CommonJS and CommonJS-like environments where a proper window is present,
// execute the factory and get jQuery
// For environments that do not inherently posses a window with a document
// (such as Node.js), expose a jQuery-making factory as module.exports
// This accentuates the need for the creation of a real window
// e.g. var jQuery = require("jquery")(window);
// See ticket #14549 for more info
module.exports = global.document ?
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
} else {
factory( global );
}
答案 1 :(得分:1)
Node.js现在用于管理JavaScript项目,即使项目是客户端。例如,Grunt,Bower,Browserify,Gulp和许多其他构建工具在Node.js上运行,即使您可以在客户端项目中使用它们。使用这些工具不会使您的项目依赖于生产中的Node。节点仅用于开发。要安装这些工具,可以使用npm,它是一个包管理器。像Maven或Ivy一样,npm将通过从互联网上下载来安装软件包及其依赖项。
安装指令涉及npm的库意味着在Node中使用,但可以在使用Browserify转换后在浏览器中使用。使用npm下载库,然后使用Browserify(使用npm安装,因为它本身在Node上运行)将其转换为浏览器样式。您应该获得一个可以在客户端项目中导入的JavaScript文件。
特别针对浏览器的库通常会将Bower称为安装方法而不是npm。 Bower也是一个包管理器,但它旨在下载和安装为浏览器编写的库,而不是Node。如果您想要的库在Bower上可用,您可以使用bower install <lib>
下载它及其所有依赖项。 Bower会将所有文件放在当前目录的bower_components
文件夹中。然后,您可以将这些文件复制到项目中,或者让项目直接从该文件夹中导入它们。
答案 2 :(得分:1)
因此,browserify只是一种工具,可以在浏览器中使用节点式模块。是的,您需要安装node.js才能使用npm和browserify。但是这些时候你需要node.js用于你的大多数前端工具集。
npm充满了用JavaScript编写并在浏览器中运行的模块。使用browserify,您可以在浏览器中使用这些模块。
它通过填充整个require
机制并使其在浏览器中工作而起作用。这也意味着您可以在模块中组织代码:
// add.js
module.exports = function(x, y) {
return x + y;
}
// app.js
var add = require('./add.js');
var result = add(7, 8);
现在您可以通过运行browserify app.js -o bundle.js
来生成您的包(您需要包含在html中的唯一脚本)。
如果您不喜欢浏览器方法,也可以使用--standalone
option生成UMD格式的JavaScript文件。然后,您可以将其简单地包含在您的html中,并将其与window.add
一起用于上一个示例。
答案 3 :(得分:0)
require语句由require.js处理,可以在javascript环境中单独使用。它是一个模块加载器,可以优化浏览器中的加载依赖性。有一个Node.js实现,但这并不意味着你必须使用Node,你可以在项目中包含require。
(p.s:npm是Node Package Manager,除非你使用Node,否则对你的项目来说是不必要的。它简化了javascript节点模块在你的项目中的包含。)