Javascript库使用require()但我没有或使用nodeJS?

时间:2014-08-21 09:32:55

标签: javascript node.js npm require

我遇到了几个使用这个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文件。但是

  1. 为什么他们不直接发布这个浏览器化的.js?有什么理由我需要自己编译吗?它应该是所有浏览器或网站的通用产品,对吧?

  2. 这个浏览器化的东西,显然是为了避免node.js,实际上似乎需要node.js本身(所有提及的指令" npm -g install browserify"等等)

4 个答案:

答案 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节点模块在你的项目中的包含。)