Weex-toolkit build without VueRouter
Without VueRouter, the compile configurations for web and weex become much more complex. The common configuration for different environments is in the webpack.common.conf.js
.
const getEntryFile = (dir) => {
dir = dir || config.sourceDir;//src
// The config.entryFilter is `**/*.vue`
const enrtys = glob.sync(`${dir}/${config.entryFilter}`, config.entryFilterOptions);
// generate entry file
enrtys.forEach(entry => {// entry is relative path of vue file
const extname = path.extname(entry);
const basename = entry.replace(`${dir}/`, '').replace(extname, '');
// generate temp file to .temp dir
const templatePathForWeb = path.join(vueWebTemp, basename + '.web.js');
const templatePathForNative = path.join(vueWebTemp, basename + '.js');
// generate vueFile.web.js for every Vue File
fs.outputFileSync(templatePathForWeb, getWebEntryFileContent(templatePathForWeb, entry));
fs.outputFileSync(templatePathForNative, getNativeEntryFileContent(templatePathForNative, entry));
webEntry[basename] = templatePathForWeb;
weexEntry[basename] = templatePathForNative;
})
}
getEntryFile
finds out all the vue files in src
directory and generates js file for every vue file.
As a result, the function collects the paths of entry file and creates 2 entry arrays for Web and Weex respectively.
Based on entry.js, getWebEntryFileContent
function generates entry file for every File:
//entryPath: .temp/vueFile.web.js
// vueFilePath: src/vueFile.vue
const getWebEntryFileContent = (entryPath, vueFilePath) => {
// relative path of Vue File
let relativeVuePath = path.relative(path.join(entryPath, '../'), vueFilePath);
// abs path of entry.js
let relativeEntryPath = helper.root(config.entryFilePath);
// abs path of plugin.js
let relativePluginPath = helper.rootNode(config.pluginFilePath);
let contents = '';
// read the entry.js
let entryContents = fs.readFileSync(relativeEntryPath).toString();
if (isWin) {
relativeVuePath = relativeVuePath.replace(/\\/g, '\\\\');
relativePluginPath = relativePluginPath.replace(/\\/g, '\\\\');
}
// add plugin info to entry file
if (hasPluginInstalled) {
contents += `\n// If detact plugins/plugin.js is exist, import and the plugin.js\n`;
contents += `import plugins from '${relativePluginPath}';\n`;
contents += `plugins.forEach(function (plugin) {\n\tweex.install(plugin)\n});\n\n`;
entryContents = entryContents.replace(/weex\.init/, match => `${contents}${match}`);
contents = ''
}
contents += `
const App = require('${relativeVuePath}');
new Vue(Vue.util.extend({el: '#root'}, App));
`;
// entry File content concats content
return entryContents + contents;
}
getNativeEntryFileContent
function generates entry file for every Vue File:
//entryPath: .temp/vueFile.js
// vueFilePath: src/vueFile.vue
const getNativeEntryFileContent = (entryPath, vueFilePath) => {
let relativeVuePath = path.relative(path.join(entryPath, '../'), vueFilePath);
let contents = '';
if (isWin) {
relativeVuePath = relativeVuePath.replace(/\\/g, '\\\\');
}
contents += `import App from '${relativeVuePath}'
App.el = '#root'
new Vue(App)
`;
return contents;
}
Respectively, the paths of entry file for weex and web are collected into two arrays: webEntry[basename] and weexEntry[basename].
According to the entry files, the compiled outputs for every Vue File is placed in ./dist .
Release Config
The webpack.prod.conf.js
file only adds a "uglify" plugin for weex building in production env.
The different things are the web release configurations in webpack.release.conf.js
file.
By HtmlWebpackPlugin
, webpack generates corresponding HTML File and and Javascript File for every Vue File.