Node.js的require与HTML的script标签引入依赖有什么区别?
script标签引入与Node.js require的核心差异
二者的底层加载机制完全不同,是为不同运行环境设计的两套依赖管理方案,具体区别如下:
- 适用运行环境不同
script标签是浏览器原生提供的JS资源加载语法,仅在浏览器环境生效;require是CommonJS规范定义的模块加载语法,仅在Node.js环境原生支持,浏览器默认不支持该语法,需要借助webpack等构建工具编译后才能运行。补充:jQuery本身是面向浏览器DOM操作设计的库,Node.js环境没有原生DOM对象,因此几乎不会有人在Node.js中用require引入jQuery使用,这也是你很少看到相关用法的原因。如果需要在Node.js中用类jQuery语法处理HTML内容,可以使用cheerio这类专为Node.js适配的DOM处理库。
另外你示例中的script标签属性写法有误,正确的资源引入应该使用src属性而非link:<script src="jquery.js"></script> <script src="example1.js"></script> - 作用域处理逻辑不同
所有通过script标签引入的JS代码,都运行在浏览器的全局作用域下:jQuery引入后会把$、jQuery两个变量挂载到window全局对象上,后续引入的example1.js可以直接从全局读取这两个变量使用,不需要额外导入操作。但如果多个引入的脚本存在同名全局变量,会直接出现变量覆盖冲突。
Node.js中每个JS文件都是独立的模块作用域:通过require引入的依赖默认不会污染全局,导出的内容仅在当前执行require的文件作用域内生效,不同模块的变量完全隔离,不会出现全局冲突问题。 - 加载执行逻辑不同
不设置async/defer属性的script标签默认是同步按顺序加载执行,前面的脚本加载执行完成后才会处理后面的标签,因此必须将依赖库放在业务代码前面引入才能生效。
require是运行时同步加载,可以在代码的任意位置调用加载需要的模块;Node.js会对已加载的模块做缓存,重复require同一个模块不会重复执行模块代码,只会返回缓存的导出结果。 - 资源查找规则不同
script标签的资源路径相对当前HTML文件解析,也可以直接填入CDN地址,浏览器会按照HTTP规则请求对应的资源。
require的路径相对当前JS文件解析,Node.js会按照CommonJS模块查找规则依次检索:优先加载Node.js内置核心模块,其次查找当前目录及上层目录的node_modules文件夹下的第三方模块,最后匹配自定义相对/绝对路径的模块。
内容的提问来源于stack exchange,提问作者chron1cle
相关产品推荐
相关产品推荐

