рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЙрдбреНрдпреВрд▓ рдСрдЯреЛрд▓реЙрдб

рд╣рд╛рд▓ рд╣реА рдореЗрдВ , Node.js рдореЗрдВ ECMAScript рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдШреЛрд╖рдгрд╛ рдХреА рдЧрдИ рдереА, рдФрд░ ES2020 рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдерд╛ред рдЗрд╕ рд▓реЗрдЦ рдХреЗ рдврд╛рдВрдЪреЗ рдореЗрдВ рдореИрдВ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕реНрдкрд╖реНрдЯ рдорд╛рдорд▓реЗ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ - рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЕрдЬреНрдЮрд╛рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рдеред


рдЖрд╡рд░рдг


рд╕рдорд╕реНрдпрд╛рдУрдВ


рдЕрдХреНрд╕рд░ рдореИрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реВрдВ:


$ tree . тФЬтФАтФА modules тФВ тФЬтФАтФА a тФВ тФВ тФФтФАтФА index.ts тФВ тФЬтФАтФА b тФВ тФВ тФФтФАтФА index.ts тФВ тФФтФАтФА c тФВ тФФтФАтФА bobule.ts тФЬтФАтФА index.ts тФФтФАтФА package.json 

рдФрд░ index.ts рдХреА рд╕рд╛рдордЧреНрд░реА:


 import a from './modules/a'; import b from './modules/b'; import c from './modules/c/bobule.ts'; export default { module: a, dopule: b, bobule: c }; 

рдФрд░ рдлрд┐рд░ рдХрд╣реАрдВ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдПрдХ рдФрд░ index.ts рд╣реИ рдЬреЛ рдЗрд╕ index.ts рдХреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ ...


рдореИрдВ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп index.ts рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдирд╛ index.ts


 import modules from './modules/*/*' 

рд▓реЗрдХрд┐рди рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░, рдпрд╣ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдореЗрд░реЗ рдкреЗрдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЗрдЪреНрдЫрд╛ рдЬрдЧрд╛рддрд╛ рд╣реИ рдмреИрд╕рд╛рдЦреА, рд╕рд╛рдЗрдХрд┐рд▓, рдврд╛рдВрдЪрд╛ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдПрдХ рдЙрдкрдпреЛрдЧреА, рдореВрд▓ рдФрд░ рдмрд╣реБрдд рдЖрд╡рд╢реНрдпрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред


рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд


рд╕реНрдереИрддрд┐рдХ рдкрд░ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд░реВрдк рд╣реИ, рдЬреЛ рд╕реНрдерд┐рддрд┐ рд╕реЗ рд▓реЛрдбрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:


 // module.ts export const a = 'i love hexlet' const b = { referral: 'hexlet.io/?ref=162475' } export default b // index.ts const module = await import('./module.ts') module.default // { referral: 'hexlet.io/?ref=162475' } module.a // 'i love hexlet' 

рддрджрдиреБрд╕рд╛рд░, рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдореЗрдВ рдереЛрдбрд╝реА рд╕реА fs рдЬреЛрдбрд╝рдХрд░, рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рд╕реНрддрд░ рд╕реЗ рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреА рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред


PHP рдиреЗ рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛


рдСрдЯреЛрд▓реИрдб рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдирдпрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ PHP рдореЗрдВ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд╛рд╕реНрддреБ рдФрд░ рдРрддрд┐рд╣рд╛рд╕рд┐рдХ рдХрд╛рд░рдгреЛрдВ рд╕реЗ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдореБрдЭреЗ рдЕрдкрдиреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╡реАрд░рддрд╛ рд╕реЗ рдкрд╛рд░ рдХрд░рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ package.json рдореЗрдВ рдПрдХ рдСрдЯреЛрд▓реЙрдб рдЕрдиреБрднрд╛рдЧ рдмрдирд╛рдиреЗ рдФрд░ рдПрдХ рдЙрдкрдХрд░рдг рдмрдирд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬреЛ рдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рдкрдврд╝рддрд╛ рд╣реИ, рдФрд░ рдорд╛рди рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдкрде:


 //  package.json { "autoload": { "modules": ["modules", "*", "index.ts"] "bobules": ["*", "*", "bobule.ts"], } } 

рдЯрдВрдХрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕ рддрдереНрдп рд╕реЗ рдПрдХ рдХрд╖реНрдЯрдкреНрд░рдж рдХреНрд╖рдг рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рдЖрд╡реЗрджрди рдХреЗ рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрджрд▓ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛрддреЗ рд╣реИрдВ: ts|js|mjs|tsx рддрд╛рдХрд┐ рдЖрдк рддреБрд░рдВрдд рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд▓реЗ рд╕рдХреЗрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЙрдиреНрд╣реАрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдЬрд┐рдирдХреА рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 //  package.json { "autoload": { "modules": ["modules", "*", "index.ts|js"] "bobules": ["*", "*", "bobule.ts|js"], } } 

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдорд▓реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:


  1. f(projectRoot, ['modules', '*', 'index.js|ts'], moduleName = 'default') // рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрде рдкрд░ рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд░реЗрдВ
  2. f(projectRoot) // package.json рд╕реЗ рд▓реЛрдбрд┐рдВрдЧ рдореЙрдбреНрдпреВрд▓, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЙрдбреНрдпреВрд▓ рдирд╛рдо f(projectRoot) рд╕реЗрдХреНрд╢рди рдореЗрдВ рдХреАрдЬрд╝) рддреАрд╕рд░реЗ рддрд░реНрдХ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА "рд╣реВрдб рдХреЗ рддрд╣рдд" рдкрд╛рд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдмрд┐рд▓реНрдбрд┐рдВрдЧ рдкрде рдПрдХ рддреБрдЪреНрдЫ рдХрд╛рд░реНрдп рд╣реИ, рд╣рдо рд╕рд┐рд░реНрдл рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рддрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЙрдкрдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рд╕рд░рдгреА рд╕рдорд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдПрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рд░рдгреА рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдВред рдирддреАрдЬрддрди, рд╢рд╛рдо рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛:


 //   package.json /   const modulesRawPathsParts = await getModulesRawPaths( projectRoot, modulePath, moduleGroupName ); //         const modulesFilesPathsParts = entries(modulesRawPathsParts).reduce( (acc, [moduleName, moduleRawPath]) => { const rawFilename = moduleRawPath.pop(); const processedFilenames = processFileExtensions(rawFilename); const pathsWithFilenames = processedFilenames.map( filename => moduleRawPath.concat(filename) ); return { ...acc, [moduleName]: pathsWithFilenames }; }, {} ); //       const modulesFilesPaths = await Promise.all( entries(modulesFilesPathsParts).map(([moduleName, modulePathParts]) => Promise.all( modulePathParts.map(modulePathPart => buildPaths(projectRoot, modulePathPart)) ) .then(paths => paths.flat().filter(processedPath => processedPath)) .then(existingPaths => ({ [moduleName]: existingPaths })), ), ); const processedModulesFilesPaths = arrayToObject(modulesFilesPaths); //    ,       const availableModules = entries(processedModulesFilesPaths).reduce( (acc, [moduleName, modulePaths]) => (modulePaths.length === 0 ? acc : { ...acc, [moduleName]: modulePaths }), {}, ); //   return Promise.all( entries(availableModules).map(([moduleName, modulePaths]) => Promise.all(modulePaths.map(moduleLoadPath => //     : import(moduleLoadPath) )).then(loadedModule => ({ [moduleName]: loadedModule, })), ), ).then(arrayToObject); 

рдзреЛрдЦрд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдЪреЗ


рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ рд╣реИ?


рдпрд╣ рдореБрдЭреЗ рдкреНрд░рддреАрдд рд╣реБрдЖ рдХрд┐ рдЧрддрд┐рд╢реАрд▓ рдЖрдпрд╛рдд рдХрд╛ рдореБрджреНрджрд╛ рдмрд╣реБрдд рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдХрд╡рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдПрдирдкреАрдПрдо рдореЗрдВ рдРрд╕реА рд╕рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдереЛрдбрд╝реА рдЕрджреНрдпрддрди рдирд╣реАрдВ рд╣реИрдВ (рдпрд╛ рдореИрдВ рдмреБрд░реА рддрд░рд╣ рд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рдерд╛?), рдФрд░ рддрдХрдиреАрдХ рдЖрдкрдХреЛ рдкрдВрдЬреАрдХрд░рдг рдФрд░ рдПрд╕рдПрдордПрд╕ рдХреЗ рдмрд┐рдирд╛ рдЕрдЪреНрдЫрд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдкреА рд▓реЗрдВрдЧреЗ, рдПрдХ рдирдпрд╛ рдкреЗрдВрдЪ рдХрд░рдХреЗ рдХреЛрдб рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХреЛ рдХрдо рдХрд░рдирд╛ рдмреИрд╕рд╛рдЦреА, рд╕рд╛рдЗрдХрд┐рд▓, рдврд╛рдВрдЪрд╛ рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рд╣рд╛рдпрдХ рд╣реИред




рд▓рд┐рдВрдХ, рд╕рдмреВрдд, рдЕрдиреБрд╡рд╛рдж:



рдЗрд╕ рдирд┐рд░реНрджреЛрд╖ рдХреЛрдб рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ:
https://github.com/Melodyn/npm-dynamicimport/blob/master/lib/index.js#L93-L120
рдпрд╣рд╛рдВ рдЕрдореВрд▓реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:
https://www.npmjs.com/package/@melodyn/dynamicimport
рдмрд┐рд▓реНрд▓реА рдпрд╣рд╛рдБ рд╣реИ:
(^ тЙЧ╧ЙтЙЧ ^)

Source: https://habr.com/ru/post/hi478974/


All Articles