const fs = require('fs')
|
const path = require('path')
|
const mkdirp = require('mkdirp')
|
const BJSON = require('buffer-json')
|
|
const {
|
getPartialIdentifier
|
} = require('./util')
|
|
const directories = new Set()
|
|
function write (key, data, callback) {
|
const dirname = path.dirname(key)
|
// template,缓存 mp template
|
if (
|
data.remainingRequest.indexOf('vue&type=template') !== -1 &&
|
process.UNI_CACHE_TEMPLATES
|
) {
|
data.mpTemplates = process.UNI_CACHE_TEMPLATES
|
delete process.UNI_CACHE_TEMPLATES
|
}
|
|
const content = BJSON.stringify(data)
|
|
if (directories.has(dirname)) {
|
// for performance skip creating directory
|
fs.writeFile(key, content, 'utf-8', callback)
|
} else {
|
mkdirp(dirname, (mkdirErr) => {
|
if (mkdirErr) {
|
callback(mkdirErr)
|
return
|
}
|
|
directories.add(dirname)
|
|
fs.writeFile(key, content, 'utf-8', callback)
|
})
|
}
|
}
|
|
function read (key, callback) {
|
fs.readFile(key, 'utf-8', (err, content) => {
|
if (err) {
|
callback(err)
|
return
|
}
|
|
try {
|
const data = BJSON.parse(content)
|
const mpTemplates = data.mpTemplates
|
if (mpTemplates) {
|
Object.keys(mpTemplates).forEach(name => {
|
fs.writeFileSync(name, mpTemplates[name], 'utf-8')
|
})
|
}
|
callback(null, data)
|
} catch (e) {
|
callback(e)
|
}
|
})
|
}
|
|
module.exports = {
|
createTemplateCacheLoader: function (api, id = 'uni-template-compiler') {
|
return {
|
resourceQuery: /type=uni-cache-loader-template/,
|
use: [{
|
loader: 'cache-loader',
|
ident: 'uni-cache-loader-template-options',
|
options: Object.assign(api.genCacheConfig(
|
id + '/' + process.env.UNI_PLATFORM,
|
getPartialIdentifier()
|
), {
|
read,
|
write
|
})
|
}]
|
}
|
}
|
}
|