require.context()的使用

require.context()方法
作用:创建当前模块的上下文
用法:require.context(directory, flag, regExp)

directory: 要导入的当前模块的文件夹目录
flag: 是否搜索当前路径的子目录
regExp: 要匹配的文件

 

 

 

1.resolve() :它返回请求被解析后得到的模块 id
2.keys(): 返回当前所有搜索到的文件的数组
3.id: 上下文模块里面所包含的模块 id

项目环境:使用webpack webpack-cli 打包

 

 案例的场景,在该项目的根目录下使用yarn build:lang命令,即可将i18ns下的多个语言包,按照文件夹合并成一个大对象并在index.js中导出;

 

 

导出的对象示例:

 

 在项目build文件下,新建一个bin文件夹,再新建一个build-lang.js文件,结构如下图:

 

 build-lang.js文件内容如下:

var fs = require('fs');
var render = require('json-templater/string');
var path = require('path');
var endOfLine = require('os').EOL;

var OUTPUT_PATH = path.join(__dirname, '../../src/i18ns/index.js');
var IMPORT_TEMPLATE = 'import deepmerge from \'deepmerge\';\nconst lang = {};'; 
var REQUIRE_TEMPLATE = 'const {{ctxName}} = require.context(\'./{{langType}}\', true, /\.js$/);\nlang[\'{{langType}}\'] = {{ctxName}}.keys().reduce((total, key) => deepmerge(total, {{ctxName}}(key).default), {});';
var MAIN_TEMPLATE = `/* Automatically generated by './build/bin/build-lang.js' */
{{include}}
console.log('lang', lang)
export default lang;
`;

var filePath = path.resolve(__dirname, "../../src/i18ns");
var files = fs.readdirSync(filePath)
var langList = [];
files.forEach(function (item, index) {
  if (item !== "index.js") {
    langList.push(item)
  }
})

var includeLangType = [];
includeLangType.push(IMPORT_TEMPLATE);
langList.forEach((item, index) => {
  includeLangType.push(render(REQUIRE_TEMPLATE, {
    ctxName: `ctx${index}`,
    langType: item
  }))
})

var template = render(MAIN_TEMPLATE, {
  include: includeLangType.join(endOfLine),
});

fs.writeFileSync(OUTPUT_PATH, template);

然后在package.json中配置脚本:

"build:lang": "node build/bin/build-lang.js",

然后测试下:执行 yarn build:lang

查看i18ns/index.js内容是否为:

/* Automatically generated by './build/bin/build-lang.js' */
import deepmerge from 'deepmerge';
const lang = {};
const ctx0 = require.context('./en', true, /.js$/);
lang['en'] = ctx0.keys().reduce((total, key) => deepmerge(total, ctx0(key).default), {});
const ctx1 = require.context('./zh-CN', true, /.js$/);
lang['zh-CN'] = ctx1.keys().reduce((total, key) => deepmerge(total, ctx1(key).default), {});
export default lang;

 

 

其他使用场景:

1、 require.context()也可以进行多模块路由的自动导入配置

2、多组件的注册;

 

posted @ 2021-05-18 13:15  芥末Yuki  阅读(3746)  评论(0编辑  收藏  举报