Я пишу библиотеки для веб-страниц в JS и "компилирую" их с помощью Webpack.Мне нужно импортировать / требовать (например, requirejs) эту библиотеку на страницах, которые находятся в отдельных проектах Webpack.Lib может быть размещен по двум отдельным путям - один относительный, а второй абсолютный.Как мне настроить веб-пакеты для экспорта библиотек, которые можно импортировать / требовать в другом проекте?
Я пробовал umd, amd, window, this и т. Д. LibraryTarget, и во всех случаях ответ на require не определен или выдает ошибку.
Моя конфигурация веб-пакета libs:
const HtmlWebPackPlugin = require('html-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const CopyWebpackPlugin = require('copy-webpack-plugin');
const CleanWebpackPlugin = require('clean-webpack-plugin');
let glob = require('glob'),
entryObject = glob.sync('./src/js/*.js').reduce(
function (entries, entry) {
let matchForRename = /^\.\/src\/(.+)\.js$/g.exec(entry);
if (matchForRename !== null && typeof matchForRename[1] !== 'undefined') {
let entryName = matchForRename[1];
if (typeof entries[entryName] !== 'undefined') {
entries[entryName].push(entry);
} else {
entries[entryName] = [entry];
}
}
return entries;
}, {}
);
module.exports = env => {
return {
devtool: env.production === 'true' ? false : 'eval-source-map',
target: 'web',
entry: entryObject,
output: {
chunkFilename: '[name].js',
publicPath: 'dist/',
libraryTarget: 'umd',
},
optimization: {
splitChunks: {
chunks: 'all',
maxInitialRequests: Infinity,
minSize: 0,
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name(module) {
// get the name. E.g. node_modules/packageName/not/this/part.js
// or node_modules/packageName
const packageName = module.context.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/)[1];
// npm package names are URL-safe, but some servers don't like @ symbols
return `js/npm/${packageName.replace('@', '')}`;
},
}
},
}
},
module: {
rules: [{
test: /\.js$/,
exclude: /node_modules/,
use: {
loader: 'babel-loader',
},
}, ]
},
plugins: [
new CleanWebpackPlugin(),
new CopyWebpackPlugin([{
from: 'src/php',
to: 'php'
}], {
copyUnmodified: true
})
]
}
};
В проекте веб-страницы я пробовал что-то вроде этого (с requirejs):
window.require.config({
baseUrl: '../../libs/',
paths: {
prod: 'http://example.com/libs/'
}
});
window.require(['js/main'], function (main) {
console.log(main);
},
function (err) {
window.require(['prod/js/main'],
function (main) {
console.log(main);
});
}
);
или только через веб-пакет:
import('../../libs/js/main.js').then(function (main) {
console.log('ok');
})
.catch(function (error) {});
try {
require(['../../libs/js/main.js'], function (main) {
console.log(main);
}, function (error) {});
} catch (error) {}
try {
define('../../libs/js/main.js', [], function () {
console.log('ok');
}, function (error) {
console.log('error');
});
} catch (error) {}
try {
define(['../../libs/js/main.js'], function () {
console.log('ok');
}, function (error) {
console.log('error');
});
} catch (error) {}
try {
define('main', ['../../libs/js/main.js'], function () {
console.log('ok');
}, function (error) {
console.log('error');
});
} catch (error) {}
Если я не использую опцию оптимизации в libs webpack conf, requirejs работает нормально, но если используется оптимизация requirejs retrun undefined: /.