详解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 相关文章推荐
JavaScript Date对象使用总结
May 14 Javascript
jquery $.each 和for怎么跳出循环终止本次循环
Sep 27 Javascript
jQuery判断复选框是否勾选的原理及示例
May 21 Javascript
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
JS实现OCX控件的事件响应示例
Sep 17 Javascript
jQuery中insertBefore()方法用法实例
Jan 08 Javascript
JQuery删除DOM节点的方法
Jun 11 Javascript
javascript获取wx.config内部字段解决微信分享
Mar 09 Javascript
微信小程序之获取当前位置经纬度以及地图显示详解
May 09 Javascript
微信小程序实现列表页的点赞和取消点赞功能
Nov 02 Javascript
webpack 处理CSS资源的实现
Sep 27 Javascript
vue实现购物车列表
Jun 30 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
索尼SONY ICF-7600A(W)电路分析
2021/03/01 无线电
抓取YAHOO股票报价的类
2009/05/15 PHP
微信公众平台网页授权获取用户基本信息中授权回调域名设置的变动
2014/10/21 PHP
php+mysql实现用户注册登陆的方法
2015/01/03 PHP
PHP判断json格式是否正确的实现代码
2017/09/20 PHP
PHP封装的验证码工具类定义与用法示例
2018/08/22 PHP
Thinkphp5 自定义上传文件名的实现方法
2019/07/23 PHP
9个javascript语法高亮插件 推荐
2009/07/18 Javascript
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
五段实用的js高级技巧
2011/12/20 Javascript
js简易namespace管理器 实例代码
2013/06/21 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
Vue 2.0 服务端渲染入门介绍
2017/03/29 Javascript
jQuery 实时保存页面动态添加的数据的示例
2017/08/14 jQuery
vue 指定组件缓存实例详解
2018/04/01 Javascript
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
详解webpack4之splitchunksPlugin代码包分拆
2018/12/04 Javascript
微信小程序实现文字跑马灯
2020/05/26 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
JavaScript实现五子棋游戏的方法详解
2019/07/08 Javascript
javascript设计模式 ? 组合模式原理与应用实例分析
2020/04/14 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
vue图片裁剪插件vue-cropper使用方法详解
2020/12/16 Vue.js
jquery自定义组件实例详解
2020/12/31 jQuery
python爬虫常用的模块分析
2014/08/29 Python
Python中itertools模块用法详解
2014/09/25 Python
python实现栅栏加解密 支持密钥加密
2019/03/20 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
Python绘制K线图之可视化神器pyecharts的使用
2021/03/02 Python
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
介绍一下gcc特性
2015/10/31 面试题
秋天的怀念教学反思
2014/04/28 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
导游词之山海关
2019/12/10 职场文书
Python实现拼音转换
2021/06/07 Python