详解weex默认webpack.config.js改造


Posted in Javascript onJanuary 08, 2018

本文介绍了weex默认webpack.config.js改造,分享给大家,具体如下:

解决的问题:

由于weex默认的webpack配置,会导致在src文件夹下的每一个.vue在temp文件夹下生成对应的一个.js文件,该js文件有一段这样的代码

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.config.js文件中,有两个方法

第一个 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文件

如果我们采用传统的vue开发,需要一个入口.js文件,我们需要对这个配置进行改造

添加入口文件配置

const entry = {index: pathTo.resolve('src', 'entry.js')};
const weexEntry = {index: pathTo.resolve('src', 'entry.js')};

删除或者更改配置(当然,第三种方法还可以把.vue组件不写在src内)

删除

  1. 删除getEntryFileContent函数
  2. 删除walk函数
  3. 删除walk() walk函数的调用

修改(代码来自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);
  }
 });
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
一个可以显示阴历的JS代码
Mar 05 Javascript
js 键盘记录实现(兼容FireFox和IE)
Feb 07 Javascript
js 为label标签和div标签赋值的方法
Aug 08 Javascript
JavaScript数组前面插入元素的方法
Apr 06 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
JS日期加减,日期运算代码
Nov 05 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
Aug 25 Javascript
JS前端笔试题分析
Dec 19 Javascript
jQuery表单元素选择器代码实例
Feb 06 Javascript
es6学习笔记之Async函数的使用示例
May 11 Javascript
页面间固定参数,通过cookie传值的实现方法
May 31 Javascript
javascript实现贪吃蛇经典游戏
Apr 10 Javascript
关于vue单文件中引用路径的处理方法
Jan 08 #Javascript
浅谈React Native Flexbox布局(小结)
Jan 08 #Javascript
Node.js使用Koa搭建 基础项目
Jan 08 #Javascript
JavaScript体验异步更好的解决办法
Jan 08 #Javascript
探索Vue高阶组件的使用
Jan 08 #Javascript
Vue入门之数据绑定(小结)
Jan 08 #Javascript
浅谈Vue数据绑定的原理
Jan 08 #Javascript
You might like
人族 TERRAN 概述
2020/03/14 星际争霸
php cli 方式 在crotab中运行解决
2010/02/08 PHP
php simplexmlElement操作xml的命名空间实现代码
2011/01/04 PHP
PHP+Ajax无刷新带进度条图片上传示例
2017/02/08 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
JavaScript 操作table,可以新增行和列并且隔一行换背景色代码分享
2013/07/05 Javascript
jQuery中slideUp()方法用法分析
2014/12/24 Javascript
js实现同一页面多个运动效果的方法
2015/04/10 Javascript
Vuejs第十一篇组件之slot内容分发实例详解
2016/09/09 Javascript
微信小程序 wx.uploadFile无法上传解决办法
2016/12/14 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
vue 多入口文件搭建 vue多页面搭建的实例讲解
2018/03/12 Javascript
Vue中使用sass实现换肤功能
2018/09/07 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
2018/10/10 Javascript
Vue 电商后台管理项目阶段性总结(推荐)
2020/08/22 Javascript
[06:06]2018DOTA2亚洲邀请赛主赛事第四日战况回顾 全明星赛欢乐上演
2018/04/07 DOTA
动态创建类实例代码
2009/10/07 Python
python打开网页和暂停实例
2014/09/30 Python
Python中的zip函数使用示例
2015/01/29 Python
Python base64编码解码实例
2015/06/21 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
python3从网络摄像机解析mjpeg http流的示例
2020/11/13 Python
python实现简单的学生管理系统
2021/02/22 Python
CSS3中Animation动画属性用法详解
2016/07/04 HTML / CSS
澳大利亚手袋、珠宝和在线时尚精品店:The Way
2019/12/21 全球购物
教师见习期自我鉴定
2014/04/28 职场文书
学校欢迎标语
2014/06/18 职场文书
小学兴趣小组活动总结
2014/07/07 职场文书
学校2014重阳节活动策划方案
2014/09/16 职场文书
古诗文之爱国名句(77句)
2019/09/24 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书