@mpxjs/webpack-plugin
Version:
mpx compile core
62 lines (51 loc) • 1.88 kB
JavaScript
const path = require('path')
const NullDependency = require('webpack/lib/dependencies/NullDependency')
const makeSerializable = require('webpack/lib/util/makeSerializable')
class RequireExternalDependency extends NullDependency {
constructor (range, url) {
super()
this.range = range
this.url = url
}
get type () {
return 'mpx require external'
}
updateHash (hash, context) {
hash.update('' + (+new Date()) + Math.random())
super.updateHash(hash, context)
}
serialize (context) {
const { write } = context
write(this.url)
write(this.range)
super.serialize(context)
}
deserialize (context) {
const { read } = context
this.url = read()
this.range = read()
super.deserialize(context)
}
}
RequireExternalDependency.Template = class RequireExternalDependencyTemplate {
apply (dependency, source, { module, chunkGraph, runtimeTemplate }) {
const { range } = dependency
const compliation = runtimeTemplate.compilation
const publicPath = compliation.outputOptions.publicPath
const chunks = chunkGraph.getModuleChunks(module)
const chunk = chunks[0]
const chunkPath = path.dirname(publicPath + chunk.name)
const imgPath = publicPath + dependency.url
let relativePath = path.relative(chunkPath, imgPath)
if (!relativePath.startsWith('.')) {
relativePath = './' + relativePath
}
if (!compliation.__mpx__.externalRequestsMap.has(chunk.name)) {
compliation.__mpx__.externalRequestsMap.set(chunk.name, new Set())
}
compliation.__mpx__.externalRequestsMap.get(chunk.name).add(relativePath)
source.replace(range[0], range[1] - 1, `require(${JSON.stringify(relativePath)})`)
}
}
makeSerializable(RequireExternalDependency, '@mpxjs/webpack-plugin/lib/dependencies/RequireExternalDependency')
module.exports = RequireExternalDependency