详解Weex基于Vue2.0开发模板搭建


Posted in Javascript onMarch 20, 2017

前言

最近有一些人反馈说在面试过程中常常被问到weex相关的知识,也侧面反映的weex的发展还是很可观的,可是目前weex的开发者大多数是中小型公司或者个人,大公司屈指可数,揪其原因可能是基于weex的开发正确的姿势大家并没有找到,而且市面上的好多轮子还是.we后缀的,众所周知,weex和vue一直在努力的进行生态互通,而且weex实现web标准化是早晚的问题,今天和大家分享一下weex基于vue2.0的开发框架模板~

工作原理

先简单熟悉一下weex的工作原理,这里引用一下weex官网上的一直图片,详细信息见官网

详解Weex基于Vue2.0开发模板搭建

开发环境搭建

weex 开发环境搭建

关于weex开发环境搭建问题见官方文档

android 、iOS 开发环境

关于native开发环境搭建问题见官方文档

框架说明

基于vue2.0搭建

像前面说的那样weex和vue一直在努力的进行生态互通,而且weex实现web标准化是早晚的问题,所以也建议开发者不要在用.we做后缀来开发了

多页模式(抛弃vue-router)

单页形态对于原生可能体验不够好,目前在 native App 里单页模式不太合适

集成三端(android、ios、h5平台)

关于android、ios、h5平台的集成与打包问题,在项目中都以解决~

集成eslint代码检查

代码检查是必要的操作,为了能够拥有vue开发的体验,将eslint集成进来~

注:

由于weexpack暂不支持vue问题,打包相关后续会集成进来~

框架介绍

package.json依赖

"dependencies": {
  "vue": "^2.1.8",
  "vue-router": "^2.1.1",
  "vuex": "^2.1.1",
  "vuex-router-sync": "^4.0.1",
  "weex-vue-render": "^0.1.4"
 },
 "devDependencies": {
  "babel-core": "^6.20.0",
  "babel-eslint": "^7.1.1",
  "babel-loader": "^6.2.9",
  "babel-preset-es2015": "^6.18.0",
  "css-loader": "^0.26.1",
  "eslint": "^3.15.0",
  "eslint-config-standard": "^6.2.1",
  "eslint-loader": "^1.6.1",
  "eslint-plugin-html": "^2.0.1",
  "eslint-plugin-promise": "^3.4.2",
  "eslint-plugin-standard": "^2.0.1",
  "postcss-cssnext": "^2.9.0",
  "serve": "^1.4.0",
  "vue-loader": "^10.0.2",
  "vue-template-compiler": "^2.1.8",
  "webpack": "^1.14.0",
  "weex-devtool": "^0.2.64",
  "weex-loader": "^0.4.1",
  "weex-vue-loader": "^0.2.5"
 }

打包配置

1、 遍历.vue文件后缀,生成相应的entry.js文件

function getEntryFileContent (entryPath, vueFilePath) {
 const relativePath = path.relative(path.join(entryPath, '../'), vueFilePath);
 return 'var App = require(\'' + relativePath + '\')\n'
  + 'App.el = \'#root\'\n'
  + 'new Vue(App)\n'
}

function walk (dir) {
 dir = dir || '.'
 let directory = path.join(__dirname, './src', dir)
 let entryDirectory = path.join(__dirname, './src/entry');
 fs.readdirSync(directory)
  .forEach(file => {
   let fullpath = path.join(directory, file)
   let stat = fs.statSync(fullpath)
   let extname = path.extname(fullpath)
   if (stat.isFile() && extname === '.vue') {
    let entryFile = path.join(entryDirectory, dir, path.basename(file, extname) + '.js')
    fs.outputFileSync(entryFile, getEntryFileContent(entryFile, fullpath))
    let name = path.join(dir, path.basename(file, extname))
    entry[name] = entryFile + '?entry=true'
   } else if (stat.isDirectory()) {
    let subdir = path.join(dir, file)
    walk(subdir)
   }
  })
}

walk()

2、通过weex-loader打包生成native jsbundle

3、 通过weex-vue-loader打包生成web jsbundle

function getBaseConfig () {
 return {
  entry: entry,
  output: {
   path: 'dist'
  },
  resolve: {
   extensions: ['', '.js', '.vue'],
   fallback: [path.join(__dirname, './node_modules')],
   alias: {
    'assets': path.resolve(__dirname, './src/assets/'),
    'components': path.resolve(__dirname, './src/components/'),
    'constants': path.resolve(__dirname, './src/constants/'),
    'api': path.resolve(__dirname, './src/api/'),
    'router': path.resolve(__dirname, './src/router/'),
    'store': path.resolve(__dirname, './src/store/'),
    'views': path.resolve(__dirname, './src/views/'),
    'config': path.resolve(__dirname, './config'),
    'utils': path.resolve(__dirname, './src/utils/')
   }
  },
  module: {
   preLoaders: [
    {
     test: /\.vue$/,
     loader: 'eslint',
     exclude: /node_modules/
    },
    {
     test: /\.js$/,
     loader: 'eslint',
     exclude: /node_modules/
    }
   ],
   loaders: [
    {
     test: /\.js$/,
     loader: 'babel',
     exclude: /node_modules/
    }, {
     test: /\.vue(\?[^?]+)?$/,
     loaders: []
    }
   ]
  },
  vue: {
   postcss: [cssnext({
    features: {
     autoprefixer: false
    }
   })]
  },
  plugins: [bannerPlugin]
 }
}

const webConfig = getBaseConfig()
webConfig.output.filename = 'web/[name].js'
webConfig.module.loaders[1].loaders.push('vue')

const weexConfig = getBaseConfig()
weexConfig.output.filename = 'weex/[name].js'
weexConfig.module.loaders[1].loaders.push('weex')

项目结构

weex-frame
├── android (android项目)
│    
├── ios (ios项目代码)
│
├── src (weex模块)
│   ├── api (api模块)
│   ├── components(组件模块) 
│   ├── constants(常量配置)  
│   ├── utils (工具模块)  
│   └── views(视图模块) 
│
└── dist (build输出模块)
    ├── weex (native使用jsbundle)
    └── web(web使用jsbundle)

项目启动

  1. git clone git@github.com:osmartian/weex-frame.git
  2. cd weex-frame
  3. npm install
  4. 执行 ./start

android 启动

  1. 打开andorid studio
  2. File -> New -> Import Project -> weex-frame/android -> 启动

iOS 启动

  1. cd ios
  2. pod install (未安装pod,请先安装)
  3. open WeexFrame.xcworkspace

h5 启动方式

打开 http://localhost:12580/weex.html

项目示例

详解Weex基于Vue2.0开发模板搭建

详解Weex基于Vue2.0开发模板搭建

android 端示例

详解Weex基于Vue2.0开发模板搭建

详解Weex基于Vue2.0开发模板搭建

详解Weex基于Vue2.0开发模板搭建

iOS 端示例

详解Weex基于Vue2.0开发模板搭建

详解Weex基于Vue2.0开发模板搭建

详解Weex基于Vue2.0开发模板搭建

结语

能看的出来上方的三端示例表现还是很一致的,本篇博文也是想给大家提供一个轮子,也欢迎大家多多提意见,共同促进weex生态成熟~

框架项目地址:weex-frame_3water.rar

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

Javascript 相关文章推荐
js版本A*寻路算法
Dec 22 Javascript
js 链式延迟执行DOME
Jan 04 Javascript
jQuery文件上传插件Uploadify使用指南
Jun 05 Javascript
jQuery插件animateSlide制作多点滑动幻灯片
Jun 11 Javascript
Angularjs之filter过滤器(推荐)
Nov 27 Javascript
使用BootStrap实现悬浮窗口的效果
Dec 13 Javascript
清空元素html("") innerHTML="" 与 empty()的区别和应用(推荐)
Aug 14 Javascript
JavaScript中Object基础内部方法图
Feb 05 Javascript
解决Angular.js中使用Swiper插件不能滑动的问题
Feb 26 Javascript
JS匿名函数和匿名自执行函数概念与用法分析
Mar 16 Javascript
JS实现的透明度渐变动画效果示例
Apr 28 Javascript
antd design table更改某行数据的样式操作
Oct 31 Javascript
基于vue.js实现侧边菜单栏
Mar 20 #Javascript
微信小程序 参数传递实例代码
Mar 20 #Javascript
vue.js指令v-model使用方法
Mar 20 #Javascript
微信小程序中子页面向父页面传值实例详解
Mar 20 #Javascript
JS查找英文文章中出现频率最高的单词
Mar 20 #Javascript
vue.js中指令Directives详解
Mar 20 #Javascript
基于vue的fullpage.js单页滚动插件
Mar 20 #Javascript
You might like
PHP与SQL注入攻击[二]
2007/04/17 PHP
浏览器关闭后,能继续执行的php函数(ignore_user_abort)
2012/08/01 PHP
php获取域名的google收录示例
2014/03/24 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
Smarty环境配置与使用入门教程
2016/05/11 PHP
php加密之discuz内容经典加密方式实例详解
2017/02/04 PHP
PHP实现基于3DES算法加密解密字符串示例
2018/08/24 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
Js实现网页键盘控制翻页的方法
2014/10/30 Javascript
AngularJS语法详解
2015/01/23 Javascript
详解AngularJS中自定义指令的使用
2015/06/17 Javascript
vue-dialog的弹出层组件
2020/05/25 Javascript
借助node实战JSONP跨域实例
2017/03/30 Javascript
在knockoutjs 上自己实现的flux(实例讲解)
2017/12/18 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
[04:36]DOTA2国际邀请赛 ti3精彩集锦
2013/08/19 DOTA
[51:17]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第二场 10月30日
2020/10/31 DOTA
python函数局部变量用法实例分析
2015/08/04 Python
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
Python实现将doc转化pdf格式文档的方法
2018/01/19 Python
Python OpenCV实现视频分帧
2019/06/01 Python
python操作gitlab API过程解析
2019/12/27 Python
Python面向对象封装操作案例详解
2019/12/31 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
CSS3实战第一波 让我们尽情的圆角吧
2010/08/27 HTML / CSS
Philosophy美国官网:美国美容品牌
2016/08/15 全球购物
介绍一下OSI七层模型
2012/07/03 面试题
简历中个人自我评价范文
2013/12/26 职场文书
我爱我的祖国演讲稿
2014/05/04 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书
2016年中学植树节活动总结
2016/03/16 职场文书
解决numpy和torch数据类型转化的问题
2021/05/23 Python