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

Javascript library uses require() but I don't have or use nodeJS?

本文关键字:nodeJS require Javascript      更新时间:2023-09-26

我遇到过几个JavaScript项目和库使用这个require()函数,以便包含其他文件,像这样:

require('somefile')

我从来没有听说过,显然这是node.js的东西,我没有也不使用。

我只是想在我自己的网站上使用这些JavaScript库,但是我看到了各种各样的涉及"npm"的指令(不管那是什么)。然后据说有一个称为require .js的替代品,但这似乎使用不同的语法,如强制使用require([…])或其他东西,而我需要包括的项目只是做require(…)。

在常规html5网站中使用JavaScript项目时,处理这种要求(…)的最简单方法是什么?(即所有应该在客户端运行)


补充:我已经尝试过require.js,但它似乎不起作用。例如,somelilibrary .js中的第一行是这样的:

var assert = require('assert')

当我之前包含require.js时,然后是someelibrary .js,我得到这个错误:

未捕获的异常:错误:模块名"assert"尚未加载然而,就上下文而言:_。使用要求([])

对于任何包含require()

的东西都会发生这种情况

另一个补充:我注意到有人提到"browserify"。我想包含的一些js项目也推荐这个。显然,这应该产生一个单一的准备使用。js文件,我可以包括。但

  1. 为什么他们不直接发布这个browserized .js ?我需要自己编译它的原因是什么?它应该适用于所有浏览器或网站,对吧?

  2. 这个browserify的东西,这显然是为了避免node.js,实际上似乎需要node.js本身(指令都提到"npm -g安装browserify"等)

库应该理想地支持以下内容,这取决于它的环境。假设你正在使用一个名为"MyLib.js"的库。

未检测到模块加载器

window.MyLib

Requirejs发现

define(['MyLib'], function (MyLib) {
  // Do something
  return {};
});

CommonJS检测到,如节点或使用browserify或wer

var MyLib = require('MyLib');

不是所有的库都符合这个,但它们应该这样做。也许您正在查看的库只支持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 );
}

Node.js现在被大量用于管理JavaScript项目,即使项目是客户端。例如,Grunt, Bower, Browserify, Gulp和许多其他构建工具都运行在Node.js上,即使你可以在客户端项目中使用它们。使用这些工具不会使项目在生产环境中依赖于Node。Node仅用于开发。要安装这些工具,可以使用npm,它是一个包管理器。像Maven或Ivy一样,npm会通过从互联网上下载来安装包及其依赖项。

那些包含npm的安装指令的库应该在Node中使用,但是在被Browserify转换后可以在浏览器中使用。用npm下载这个库,然后用Browserify(你要用npm安装它,因为它本身运行在Node上)把它转换成浏览器样式。你应该得到一个可以导入到客户端项目中的JavaScript文件。

专门针对浏览器的库通常会使用Bower而不是npm作为安装方法。Bower也是一个包管理器,但它的设计目的是下载和安装为浏览器编写的库,而不是Node。如果您想要的库在Bower上可用,您可以使用bower install <lib>下载它及其所有依赖项。Bower将把所有文件放在当前目录下的bower_components文件夹中。然后,您可以将这些文件复制到您的项目中,或者使您的项目直接从此文件夹导入它们。

所以,browserify只是一个可以在浏览器中使用节点样式模块的工具。是的,为了使用npm和browserify,你需要安装node.js。但是这些时候你需要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中的唯一脚本)。

如果您不喜欢browserify方法,您也可以使用--standalone选项来生成UMD格式的JavaScript文件。然后,您可以简单地将其包含在html中,并在前面的示例中与window.add一起使用。

require语句由require.js处理,它可以在javascript环境中独立使用。它是一个模块加载器,用于优化浏览器中的加载依赖项。有一个Node.js实现,但这并不意味着你必须使用Node,你可以在你的项目中包含require。

(p。s: npm是Node包管理器,在你的项目中是不必要的,除非你正在使用Node。它简化了将javascript节点模块包含到项目中的过程。