For this, I use webpack require.context:
Templates-factory.js
import {resolve} from 'path'; export const templatesFactory = (ctx, dir, filename) => { return $templateCache => ctx.keys().forEach(key => { const templateId = (() => { switch (typeof filename) { case 'function': return resolve(dir, filename(key)); case 'string': return resolve(dir, filename); default: return resolve(dir, key); } })(); $templateCache.put(templateId, ctx(key)); }); };
app.html-bundle.js
import {templatesFactory} from './templates-factory'; const ctx = require.context('./', true, /\.html$/); export const AppHtmlBundle = angular.module('AppHtmlBundle', []) .run(templatesFactory(ctx, __dirname)) .name;
Remember to add the html downloader to your webpack.config.js :
[{ test: /\.html$/, use: { loader: 'html-loader', options: { minimize: false, root: path.resolve(__dirname, './src') } } }]
You may also need to convert relative paths to absolute ones. For this purpose, I use my self-written Babel plugin ng-template-url-absolutetify :
[{ test: /\.(es6|js)$/, include: [path.resolve(__dirname, 'src')], exclude: /node_modules/, loader: 'babel-loader', options: { plugins: [ '@babel/plugin-syntax-dynamic-import', ['ng-template-url-absolutify', {baseDir: path.resolve(__dirname, 'src'), baseUrl: ''}] ], presets: [['@babel/preset-env', {'modules': false}]] } },