将预定义函数导入 ES6 模块
Importing predefined functions into an ES6 module
第 1 部分:
在我的主 .js 文件中,我设置了几个快捷函数:
// Selector shortcuts - mimic jQuery style selectors but using more modern, standard code
const $ = ( selector, scope = document ) => scope.querySelector( selector );
const $$ = ( selector, scope = document ) => scope.querySelectorAll( selector );
const on = ( el, type, listener ) => el.addEventListener( type, listener );
第 2 部分:
我正在使用 ES6 模块将我网站的代码拆分为符合逻辑的、可管理的块。目前我的本地构建设置正在使用 Parcel,我相信它使用 Babel 来转换模块。
这些被导入到定义了选择器函数的同一个主 .js 文件中:
// Selector shortcuts - mimic jQuery style selectors but using more modern, standard code
const $ = ( selector, scope = document ) => scope.querySelector( selector );
const $$ = ( selector, scope = document ) => scope.querySelectorAll( selector );
const on = ( el, type, listener ) => el.addEventListener( type, listener );
// Load components
import BGVideo from './BGVideo';
import FieldLabel from './FieldLabel';
// Invoke components
on( document, 'DOMContentLoaded', ( e ) => {
$$( '[data-background-video]' ).forEach( ( el ) => {
new BGVideo( el );
} );
$$( '.c-form__item' ).forEach( ( el ) => {
new FieldLabel( el );
} );
} );
这些在主 .js 文件中工作得很好,但在模块文件中却不行 - 任何使用它们的尝试都会在控制台中触发错误,例如Uncaught ReferenceError: $ is not defined
是否可以在模块文件中访问这些函数,而无需在每个模块的顶部重写它们?
干杯
Is it possible access to these functions within the module files?
没有。它们在主模块的范围内。您可以将它们导出并导入到其他模块中,但这是不可取的 - 它会在您的入口点上产生循环依赖。
without rewriting them at the top of every module?
只需将它们放在自己的模块中,然后到处导入即可。
// dom_helpers.js
/* Selector shortcuts - mimic jQuery style selectors but using more modern, standard code */
export const $ = (selector, scope = document) => scope.querySelector(selector);
export const $$ = (selector, scope = document) => scope.querySelectorAll(selector);
export const on = (el, type, listener) => el.addEventListener(type, listener);
// master.js
// Load components
import initBGVideo from './BGVideo';
import initFieldLabel from './FieldLabel';
import {$$, on} from './dom_helpers';
// Invoke components
on(document, 'DOMContentLoaded', e => {
for (const el of $$('[data-background-video]')) {
initBGVideo(el);
}
for (const el of $$('.c-form__item')) {
initFieldLabel(el);
}
});
// BGVideo.js
import {$, $$, on} from './dom_helpers';
export default function init(el) {
…
}
第 1 部分: 在我的主 .js 文件中,我设置了几个快捷函数:
// Selector shortcuts - mimic jQuery style selectors but using more modern, standard code
const $ = ( selector, scope = document ) => scope.querySelector( selector );
const $$ = ( selector, scope = document ) => scope.querySelectorAll( selector );
const on = ( el, type, listener ) => el.addEventListener( type, listener );
第 2 部分:
我正在使用 ES6 模块将我网站的代码拆分为符合逻辑的、可管理的块。目前我的本地构建设置正在使用 Parcel,我相信它使用 Babel 来转换模块。
这些被导入到定义了选择器函数的同一个主 .js 文件中:
// Selector shortcuts - mimic jQuery style selectors but using more modern, standard code
const $ = ( selector, scope = document ) => scope.querySelector( selector );
const $$ = ( selector, scope = document ) => scope.querySelectorAll( selector );
const on = ( el, type, listener ) => el.addEventListener( type, listener );
// Load components
import BGVideo from './BGVideo';
import FieldLabel from './FieldLabel';
// Invoke components
on( document, 'DOMContentLoaded', ( e ) => {
$$( '[data-background-video]' ).forEach( ( el ) => {
new BGVideo( el );
} );
$$( '.c-form__item' ).forEach( ( el ) => {
new FieldLabel( el );
} );
} );
这些在主 .js 文件中工作得很好,但在模块文件中却不行 - 任何使用它们的尝试都会在控制台中触发错误,例如Uncaught ReferenceError: $ is not defined
是否可以在模块文件中访问这些函数,而无需在每个模块的顶部重写它们?
干杯
Is it possible access to these functions within the module files?
没有。它们在主模块的范围内。您可以将它们导出并导入到其他模块中,但这是不可取的 - 它会在您的入口点上产生循环依赖。
without rewriting them at the top of every module?
只需将它们放在自己的模块中,然后到处导入即可。
// dom_helpers.js
/* Selector shortcuts - mimic jQuery style selectors but using more modern, standard code */
export const $ = (selector, scope = document) => scope.querySelector(selector);
export const $$ = (selector, scope = document) => scope.querySelectorAll(selector);
export const on = (el, type, listener) => el.addEventListener(type, listener);
// master.js
// Load components
import initBGVideo from './BGVideo';
import initFieldLabel from './FieldLabel';
import {$$, on} from './dom_helpers';
// Invoke components
on(document, 'DOMContentLoaded', e => {
for (const el of $$('[data-background-video]')) {
initBGVideo(el);
}
for (const el of $$('.c-form__item')) {
initFieldLabel(el);
}
});
// BGVideo.js
import {$, $$, on} from './dom_helpers';
export default function init(el) {
…
}