weex默認webpack.config.js改造

解決的問題:

因爲weex默認的webpack配置,會致使在src文件夾下的每個.vue在temp文件夾下生成對應的一個.js文件,該js文件有一段這樣的代碼vue

contents += 'var App = require(\'' + relativePath + '\')\n';
    contents += 'App.el = \'#root\'\n';
    contents += 'new Vue(App)\n';
複製代碼

會致使多個vue對象掛載同一個id(#root),致使整個頁面就只有一個vue對象,沒法像寫spa項目同樣寫weex項目,所以在這裏對webpack.cofig進行改造(添加一個entry.js入口js文件,和一個最外層的App.vue承載路由渲染)webpack

默認的webpack.config.js文件中,有兩個方法git

第一個 getEntryFileContent

const getEntryFileContent = (entryPath, vueFilePath) => {
    let relativePath = pathTo.relative(pathTo.join(entryPath, '../'), vueFilePath);
    let contents = '';
    /**
     * The plugin's logic currently only supports the .we version * which will be supported later in .vue */ if (hasPluginInstalled) { const plugindir = pathTo.resolve('./web/plugin.js'); contents = 'require(\'' + plugindir + '\') \n'; } if (isWin) { relativePath = relativePath.replace(/\\/g, '\\\\'); } contents += 'var App = require(\'' + relativePath + '\')\n'; contents += 'App.el = \'#root\'\n'; contents += 'new Vue(App)\n'; return contents; } 複製代碼

第二個 walk

const walk = (dir) => {
    dir = dir || '.';
    const directory = pathTo.join(__dirname, 'src', dir);
    fs.readdirSync(directory).forEach((file) => {
      const fullpath = pathTo.join(directory, file);
      const stat = fs.statSync(fullpath);
      const extname = pathTo.extname(fullpath);
      if (stat.isFile() && extname === '.vue' || extname === '.we') {
        if (!fileType) {
          fileType = extname;
        }
        if (fileType && extname !== fileType) {
          console.log('Error: This is not a good practice when you use ".we" and ".vue" togither!');
        }
        const name = pathTo.join(dir, pathTo.basename(file, extname));
        if (extname === '.vue') {
          const entryFile = pathTo.join(vueWebTemp, dir, pathTo.basename(file, extname) + '.js');
          fs.outputFileSync(pathTo.join(entryFile), getEntryFileContent(entryFile, fullpath));
          entry[name] = pathTo.join(__dirname, entryFile) + '?entry=true';
        }
        weexEntry[name] = fullpath + '?entry=true';
      } else if (stat.isDirectory() && file !== 'build' && file !== 'include') {
        const subdir = pathTo.join(dir, file);
        walk(subdir);
      }
    });
  }
複製代碼

這兩個方法,是遍歷src中的.vue文件,而後在temp文件夾中生成一個相對應的JS文件github

若是咱們採用傳統的vue開發,須要一個入口.js文件,咱們須要對這個配置進行改造

  1. 添加入口文件配置
const entry = {index: pathTo.resolve('src', 'entry.js')};
const weexEntry = {index: pathTo.resolve('src', 'entry.js')};
複製代碼
  1. 刪除或者更改配置(固然,第三種方法還能夠把.vue組件不寫在src內)

    刪除

    1. 刪除getEntryFileContent函數web

    2. 刪除walk函數bash

    3. 刪除walk() walk函數的調用weex

    修改(代碼來自github上高仿網易嚴選項目)

    注意看最外層的if判斷,添加了額外條件 若是是文件且後綴是.vue且不是App.vue的,則進入判斷。不然,判斷是否是page文件夾,若是不是,則結束。
function walk(dir) {
  dir = dir || '.';
  const directory = pathTo.join(__dirname, 'src', dir);
  fs.readdirSync(directory)
    .forEach((file) => {
      const fullpath = pathTo.join(directory, file);
      const stat = fs.statSync(fullpath);
      const extname = pathTo.extname(fullpath);
      const basename = pathTo.basename(fullpath);
      console.log("配置",file,fullpath,stat,extname,basename,)
      if (stat.isFile() && extname === '.vue' && basename != 'App.vue' ) {
        if (!fileType) {
          fileType = extname;
        }
        if (fileType && extname !== fileType) {
          console.log('Error: This is not a good practice when you use ".we" and ".vue" togither!');
        }
        const name = pathTo.join(dir, pathTo.basename(file, extname));
        if (extname === '.vue') {
          const entryFile = pathTo.join(vueWebTemp, dir, pathTo.basename(file, extname) + '.js');
          fs.outputFileSync(pathTo.join(entryFile), getEntryFileContent(entryFile, fullpath));
          entry[name] = pathTo.join(__dirname, entryFile) + '?entry=true';
        }
          weexEntry[name] = fullpath + '?entry=true';
      } else if (stat.isDirectory() && ['build','include','assets','filters','mixins'].indexOf(file) == -1 ) {
        const subdir = pathTo.join(dir, file);
        walk(subdir);
      }
    });
}
複製代碼
相關文章
相關標籤/搜索