详解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效率调优经验
Jun 04 Javascript
深入解析JavaScript中的数字对象与字符串对象
Oct 21 Javascript
jQuery与Ajax以及序列化
Feb 01 Javascript
AngularJS数据源的多种获取方式汇总
Feb 02 Javascript
JavaScript希尔排序、快速排序、归并排序算法
May 08 Javascript
使用bootstrap3开发响应式网站
May 12 Javascript
ES6学习之变量的解构赋值
Feb 12 Javascript
JS实现无缝循环marquee滚动效果
May 22 Javascript
JavaScript实现小球沿正弦曲线运动
Sep 07 Javascript
laravel实现中文和英语互相切换的例子
Sep 30 Javascript
深入了解Vue.js 混入(mixins)
Jul 23 Javascript
JavaScript中遍历的十种方法总结
Dec 15 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
php 接口类与抽象类的实际作用
2009/11/26 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
php匹配字符中链接地址的方法
2014/12/22 PHP
php获取指定范围内最接近数的方法
2015/06/02 PHP
PHP统计目录中文件以及目录中目录大小的方法
2016/01/09 PHP
用函数式编程技术编写优美的 JavaScript
2006/11/25 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
jquery动态增加删减表格行特效
2015/11/20 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
vant中的toast层级改变操作
2020/11/04 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
vue实现登录功能
2020/12/31 Vue.js
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
Python图算法实例分析
2016/08/13 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
python机器学习理论与实战(二)决策树
2018/01/19 Python
详解Python核心对象类型字符串
2018/02/11 Python
用Python3创建httpServer的简单方法
2018/06/04 Python
Python 打印中文字符的三种方法
2018/08/14 Python
python pytest进阶之conftest.py详解
2019/06/27 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
Python爬虫新手入门之初学lxml库
2020/12/20 Python
HTML5标签大全
2016/11/23 HTML / CSS
优秀研究生自我鉴定
2013/12/04 职场文书
畜牧兽医本科生的自我评价
2014/03/03 职场文书
气象学专业个人求职信
2014/03/15 职场文书
学校政风行风自查自纠报告
2014/10/21 职场文书
2015年信息中心工作总结
2015/05/25 职场文书
师德师风心得体会(2016精选篇)
2016/01/12 职场文书
MySQL系列之十五 MySQL常用配置和性能压力测试
2021/07/02 MySQL
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android
uniapp开发打包多端应用完整方法指南
2022/12/24 Javascript