如何在另一个 JavaScript 文件中包含一个 JavaScript 文件?
技术问答
222 人阅读
|
0 人回复
|
2023-09-12
|
JavaScript 中有没有类似之处?@importCSS 的东西允许你在另一个 JavaScript 文件中包含一个 JavaScript 文件?$ I) W' n9 r1 q7 z2 h% M
4 m# J, y7 L, R0 {2 _; L( m 解决方案:
1 K. T! A5 z4 d! `4 L 旧版本的 JavaScript 没有导入、包含或要求,所以开发了许多不同的方法来解决这个问题。$ T; u$ Y. H4 [& }0 d2 t" _
但从 2015年到 (ES6)开始,JavaScript 已经有了ES 模块标准为6 Node.js大多数现代浏览器也支持 中导入模块。
3 [* ~2 z3 F) ]- w为了与旧浏览器兼容,这种构建工具WebPack和汇总和/或transpilation可以使用巴贝尔等工具。
`9 l. f. [& Y* n8 b! MES6 模块自 8.5 版以来,Node.js已支持ECMAScript (ES6) 模块,带有--experimental-modules标志,至少从 Node.js v13.8.0 起不带标志。ESM”(对Node.js的以往CommonJS风格模块系统CJS你要么用"type": "module"中package.json或者给文件的扩展名.mjs。(同样,.cjs若您的默认值为 ESM,使用 可以命名Node.js 以前的 CJS 模块编写的模块。
" D5 j/ J6 C! Z* X; q, i& Q9 J4 v J使用package.json:
& f$ \: U6 V8 ?& K# B$ m# [8 F{ "type": "module"}
/ }3 e: j. q& \( E, f& r% p3 ~ 然后module.js:) {7 j( h4 ~2 G7 ~
export function hello() { return "Hello";}
) q+ V: P6 c' V& n q+ V 然后main.js:6 C9 e' Q# l& {3 I3 U1 s
import { hello } from './module.js';let val = hello(); / val is "Hello";/ s1 j# t# h9 ]: [3 ~9 F. ~
使用.mjs,您将拥有module.mjs:/ z2 i7 ^! }7 W' }$ |3 ?
export function hello() { return "Hello";}
9 L9 t! G' T J& M/ ^' Y- X, ^3 x, V 然后main.mjs:0 U/ \) V8 i3 M( k; c" S" @
import { hello } from './module.mjs';let val = hello(); / val is "Hello";
7 {9 h f6 w3 q- j3 u9 p 在浏览器中ECMAScript 模块从Safari 10.1、Chrome 61、Firefox 60 和 Edge 从16 开始,浏览器支持直接加载 ECMAScript 模块(不需要像 Webpack 这样的工具)caniuse检查当前支持。不需要 Node.js 的.mjs扩展;浏览器完全忽略了模块/脚本上的文件扩展名。
1 r1 i, D6 ?% P# [' n( L. c' p// hello.mjs -- or it could be simply `hello.js`export function hello(text) { const div = document.createElement('div'); div.textContent = `Hello ${text}`; document.body.appendChild(div);}
- A, w* n0 ]8 O; z+ @ 浏览器中的动态导入动态导入允许脚本根据需要加载其他脚本:- y8 T+ f1 ]4 D
; g2 Z+ M' G* B2 |% F- [/code]Node.js 需要在 Node.js老 仍被广泛使用CJS 模块样式是module.exports/require系统。[code]// mymodule.jsmodule.exports = { hello: function()(){ return "Hello"; }/ server.jsconst myModule = require('./mymodule');let val = myModule.hello(); // val is "Hello"
. p+ G4 [3 s; M5 J8 Y0 d3 h$ G. r: w JavaScript 还有其他方法可以在不需要预处理的浏览器中包含外部 JavaScript 内容。& @! V* P; c: f+ t# U3 R& ?/ }# Y
AJAX 加载可以用 AJAX 调用加载附加脚本,然后使用eval这是最直接的方法,但因为 JavaScript 沙箱安全模型,仅限于您的域。eval也为错误、黑客和安全问题打开了大门。
5 ?# J* L8 ]/ @& A. `6 W7 B1 c获取加载就像动态导入一样,你可以通过fetch调用使用 Promise 用于加载一个或多个脚本Fetch Inject库控脚本依赖项的执行顺序:8 z( r- V9 r7 M$ ~/ r
fetchInject([ 'https://cdn.jsdelivr.net/momentjs/2.17.1/moment.min.js']).then(() => { console.log(`Finish in less than ${moment().endOf('year').fromNow(true)}`)})
: A! r. P2 ]4 y+ |% U jQuery 加载在jQuery库在同一行提供加载功能:
% v- j$ u+ c3 p' n* @$ E$.getScript("my_lovely_script.js",function() { alert("Script loaded but not necessarily executed.");});7 x; h3 h9 s2 P; ~- i9 y! v6 ]( q
加载动态脚本你可以带脚本 URL 将脚本标记添加到 HTML 中。为避免 jQuery 费用,这是一个理想的解决方案。6 A& }2 g0 d( e. [9 \; {
脚本甚至可以停留在不同的服务器上。此外,浏览器将评估代码。标签可以注入或网页,或者只是在收盘前插入</strong>标签。
: I8 w& u, s2 Q3 e这是一个如何工作的例子:) [& j- t+ ^' i. y
function dynamicallyLoadScript(url) var script = document.createElement("script"); // create a script DOM node script.src = url; // set its src to the provided URL document.head.appendChild(script); // add it to the end of the head section of the page (could change 'head' to 'body' to add it to the end of the body section instead)}/ z$ a- t' `! D, i! r. p# \3 U
此函数将在页面的 head 在部分末尾添加一个新标签,其中src 属性设置作为第一个参数提供给函数URL。* |: S0 ~8 m Y. n$ _
这两种解决方案都在JavaScript Madness: Dynamic Script Loading 讨论和解释。, I/ v8 Z8 |& `2 M2 j/ K$ q
检测脚本何时执行现在,有一个你必须知道的大问题。这意味着您远程加载代码。现代 Web 浏览器将加载文件并继续执行您当前的脚本,因为它们异步加载所有内容以提高性能。(适用于 jQuery 方法和手动动态脚本加载方法。
; a; e5 x9 y/ w4 d这意味着如果您直接使用这些技巧,您将无法在要求加载后的下一行使用新加载的代码,因为它仍然会加载。
! R/ l, X3 {0 F* C+ k- [例如:my_lovely_script.js包含MySuperObject:& H& Q6 K( h3 }4 g8 n
var js = document.createElement("script");js.type = "text/javascript";js.src = jsFilePath;document.body.appendChild(js);var s = new MySuperObject();Error : MySuperObject is undefined- S3 M. D- P. p% V" W4 V
然后单击重新加载页面F5。它有效!令人困惑…
3 T: h7 \6 j) U那该怎么办呢?9 w" R5 h6 b. u2 L# S' q- ] t
嗯,你可以用作者在我给你的链接中推荐的 hack。综上所述,对于匆忙的人来说,他在脚本加载时使用事件来运行回调函数。因此,您可以将所有使用远程库的代码放入回调函数中。 ]3 k/ R+ c& k. w" d) D
function loadScript(url,callback){ / Adding the script tag to the head as suggested before var head = document.head; var script = document.createElement('script script.type = 'text/javascript script.src = url; // Then bind the event to the callback function. // There are several events for cross browser compatibility. script.onreadystatechange = callback; script.onload = callback; // Fire the loading head.appendChild(script);}
, x2 `1 O3 o4 a9 g* i2 d 然后写作要加载到脚本上lambda 函数后使用的代码:
; |* ]4 O+ T0 F4 q' W9 Rvar myPrettyCode = function() { / / Here,do whatever you want};
) n' B. w! w0 P/ F- T, ? 然后你操作所有这些:
; P8 r8 I' ]% ^3 floadScript("my_lovely_script.js",myPrettyCode);; p) s# n% V1 \' L8 S( }1 o
请注意,脚本可能在 DOM 加载后或之前执行取决于浏览器以及您是否包含它script.async = false;. 9 @- Z# Q' j$ O. H8 j' |% T0 S7 g
合并/预处理源代码正如这个答案开头提到的,许多开发人员在他们的项目中使用建筑/转换工具,如 Parcel、Webpack 或 Babel,允许他们使用即将推出的 JavaScript 语法为旧浏览器提供向后兼容性、合并文件、缩小、执行代码拆分等。 |
|
|
|
|
|