UNPKG

webpack-i18n-plugin-plus

Version:

webpack国际化插件-升级版,支持script中的中文识别,支持自动翻译

88 lines (77 loc) 3.32 kB
const qs = require("querystring"); const isPitcher = (l) => l.path !== __filename; const isNullLoader = (l) => /(\/|\\|@)null-loader/.test(l.path); const loaderPath = require.resolve("./index.js"); const loaderUtils = require("loader-utils"); module.exports = function (source) { return source; }; module.exports.pitch = function (remainingRequest) { const options = loaderUtils.getOptions(this) || {}; const query = qs.parse(this.resourceQuery.slice(1)); let loaders = this.loaders; // remove self loaders = loaders.filter(isPitcher); // do not inject if user uses null-loader to void the type (#1239) if (loaders.some(isNullLoader)) { return; } const genRequest = (loaders, request) => { // Important: dedupe since both the original rule // and the cloned rule would match a source import request. // also make sure to dedupe based on loader path. // assumes you'd probably never want to apply the same loader on the same // file twice. // Exception: in Vue CLI we do need two instances of postcss-loader // for user config and inline minification. So we need to dedupe baesd on // path AND query to be safe. const seen = new Map(); const loaderStrings = []; loaders.forEach((loader) => { const identifier = typeof loader === "string" ? loader : loader.path + loader.query; const request = typeof loader === "string" ? loader : loader.request; if (!seen.has(identifier)) { seen.set(identifier, true); // loader.request contains both the resolved loader path and its options // query (e.g. ??ref-0) loaderStrings.push(request); } }); let loadRequest = request.replace(/\\['"]+/g, '"').split("-!"); return loaderUtils.stringifyRequest(this, "-!" + [...loaderStrings, loadRequest[1]].join("!")); }; let prePitcher = options.prePitcher; let prePitcherLoader = require(prePitcher.loader); let request = prePitcherLoader.pitch.call({ ...this, loaders }, remainingRequest); if (query.type === "template") { const newRequest = genRequest([loaderPath], request); // the template compiler uses esm exports let exportStr = `export * from ${newRequest}`; return exportStr; } if (query.type === "script") { const genRequestScript = (loaders, request) => { const seen = new Map(); const loaderStrings = []; loaders.forEach((loader) => { const identifier = typeof loader === "string" ? loader : loader.path + loader.query; const request = typeof loader === "string" ? loader : loader.request; if (!seen.has(identifier)) { seen.set(identifier, true); loaderStrings.push(request); } }); const loadRequest = request.replace(/\\['"]+/g, '"').split(";") const requestPaths = loadRequest.map((item) => { const arr = item.replace(/\\['"]+/g, '"').split('"-!') if(arr.length === 2) { return arr[0] + loaderUtils.stringifyRequest(this, "-!" + [...loaderStrings, arr[1]].join("!").replace('"', '')); } return item }) return requestPaths.join(';') }; return genRequestScript([loaderPath], request) } return request; };