若是你的 require参数含有表达式(expressions),会建立一个上下文(context),由于在编译时(compile time)并不清楚具体是哪个模块被导入vue
require("./template/" + name + ".ejs");
复制代码
webpack 解析 require() 的调用,提取出来以下这些信息:webpack
Directory: ./template
Regular expression: /^.*\.ejs$/
复制代码
则会返回template目录下的全部后缀为.ejs模块的引用,包含子目录。git
能够使用 require.context() 方法来建立本身的(模块)上下文,这个方法有 3 个参数:github
require.context(directory, useSubdirectories = false, regExp = /^\.\//)
require.context("./test", false, /\.test\.js$/);
//(建立了)一个包含了 test 文件夹(不包含子目录)下面的、全部文件名以 `.test.js` 结尾的、能被 require 请求到的文件的上下文。
require.context("../", true, /\.stories\.js$/);
//(建立了)一个包含了父级文件夹(包含子目录)下面,全部文件名以 `.stories.js` 结尾的文件的上下文。
复制代码
require.context模块导出(返回)一个(require)函数,这个函数能够接收一个参数:request 函数–这里的 request 应该是指在 require() 语句中的表达式web
导出的方法有 3 个属性: resolve, keys, id。正则表达式
Vue 全局组件:vuex
module.exports.install = function (Vue) {
/*
全部在./components目录下的.vue组件自动注册为全局组件
以<mv-***></mv-***>为组件标签名,***是组件的.name,没有name的时候是组件的文件名
*/
const requireAll = context => context.keys().map(context);
const component = require.context('./components', false, /\.vue$/);
// const directive = require.context('./directives', false, /\.js$/);
requireAll(component).forEach((item) => {
const name = (item.name || /(\S+\/)(\S+)\.vue/.exec(item.hotID)[2]).toLowerCase();
Vue.component(`mv-${name}`, item);
});
};
复制代码
/**
* The file enables `@/store/index.js` to import all vuex modules
* in a one-shot manner. There should not be any reason to edit this file.
*/
const files = require.context('./modules', false, /\.js$/)
console.log('------------')
console.log(files.keys())
console.log('------------')
const modules = {}
files.keys().forEach(key => {
modules[key.replace(/(\.\/|\.js)/g, '')] = files(key).default
})
console.log('------------')
console.log(modules)
console.log('------------')
export default modules
复制代码
要引入svg下面全部的svg文件: 在该文件(icons)目录下新建一个js文件index.js 写以下代码:express
let requireAll = requireContext => requireContext.keys().map(requireContext)
let req = require.context('./svg', false, /\.svg$/)
requireAll(req)
复制代码
const requireAll = context => context.keys().map(context);
const component = require.context('./components', false, /\.vue$/); // false 不遍历子目录,true遍历子目录
requireAll(component).forEach(({default:item}) => {
console.log(item)
Vue.component(`wb-${item.name}`, item);
});
复制代码
Object.keys(components).forEach((key) => {
var name = key.replace(/(\w)/, (v) => v.toUpperCase()) //首字母大写
Vue.component(`v${name}`, components[key])
})
复制代码
G:\Code\Vue\vue-global-component\src\assets>tree /f
卷 其它 的文件夹 PATH 列表
卷序列号为 1081-0973
G:.
│ logo.png
└─kittens
kitten1.jpg
kitten2.jpg
kitten3.jpg
kitten4.jpg
复制代码
<template>
<div id="app">
<img src="@/assets/logo.png">
<li v-for="item in images">
<h3>Image: {{ item }}</h3>
<img :src="imgUrl(item)">
</li>
</div>
</template>
<script>
var imagesContext = require.context('@/assets/kittens/', false, /\.jpg$/);
console.log(imagesContext)
console.log(imagesContext('./kitten1.jpg'))
console.log(imagesContext.keys())
export default {
created: function() {
this.images = imagesContext.keys();
},
name: 'haha',
data() {
return {
images: [],
msg: 'Welcome to Your Vue.js App'
}
},
methods: {
imgUrl: function(path) {
//console.log('Path:' + path);
return imagesContext(path)
}
}
}
</script>
<style>
#app {
font-family: 'Avenir', Helvetica, Arial, sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
text-align: center;
color: #2c3e50;
margin-top: 60px;
}
h1,
h2 {
font-weight: normal;
}
ul {
list-style-type: none;
padding: 0;
}
li {
display: inline-block;
margin: 0 10px;
}
a {
color: #42b983;
}
</style>
复制代码
import Vue from 'vue'
function capitalizeFirstLetter(string) {
return string.charAt(0).toUpperCase() + string.slice(1)
}
const requireComponent = require.context(
'.', false, /\.vue$/
//找到components文件夹下以.vue命名的文件
)
requireComponent.keys().forEach(fileName => {
const componentConfig = requireComponent(fileName)
const componentName = capitalizeFirstLetter(
fileName.replace(/^\.\//, '').replace(/\.\w+$/, '')
//由于获得的filename格式是: './baseButton.vue', 因此这里咱们去掉头和尾,只保留真正的文件名
)
Vue.component(componentName, componentConfig.default || componentConfig)
})
复制代码
import Vue from 'vue'
let contexts = require.context('.', false, /\.vue$/)
contexts.keys().forEach(component => {
let componentEntity = contexts(component).default
// 使用内置的组件名称 进行全局组件注册
Vue.component(componentEntity.name, componentEntity)
})
复制代码