详解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 相关文章推荐
JavaScript读取中文cookie时的乱码问题的解决方法
Oct 14 Javascript
网页中可关闭的漂浮窗口实现可自行调节
Aug 20 Javascript
通过url查找a元素应用案例
Apr 29 Javascript
javascript中var的重要性分析
Feb 11 Javascript
你有必要知道的25个JavaScript面试题
Dec 29 Javascript
DOM操作和jQuery实现选项移动操作的简单实例
Jun 07 Javascript
js移动焦点到最后位置的简单方法
Nov 25 Javascript
js实现数组去重方法及效率?Ρ? target=
Feb 14 Javascript
js获取元素下的第一级子元素的方法(推荐)
Mar 05 Javascript
详解50行代码,Node爬虫练手项目
Apr 22 Javascript
javascript的delete运算符知识点总结
Nov 19 Javascript
javascript异常处理实现原理详解
Feb 17 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 301转向实现代码
2008/09/18 PHP
PHP 第一节 php简介
2012/04/28 PHP
js使用栈来实现10进制转8进制与取除数及余数
2014/06/11 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
详解vue.js移动端导航navigationbar的封装
2017/07/05 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
用nodejs实现json和jsonp服务的方法
2017/08/25 NodeJs
js Dom实现换肤效果
2017/10/21 Javascript
微信小程序实现之手势锁功能实例代码
2018/07/19 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
详解Vue源码学习之双向绑定
2019/04/10 Javascript
微信小程序如何连接Java后台
2019/08/08 Javascript
Vue两个版本的区别和使用方法(更深层次了解)
2020/02/16 Javascript
原生js实现随机点名
2020/07/05 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
[50:48]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
儿童学习python的一些小技巧
2018/05/27 Python
python 借助numpy保存数据为csv格式的实现方法
2018/07/04 Python
Python 经典面试题 21 道【不可错过】
2018/09/21 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
详解python中__name__的意义以及作用
2019/08/07 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
世界知名接发和假发品牌:Poze Hair
2017/03/08 全球购物
远程教育心得体会
2014/01/03 职场文书
电子邮箱格式怎么写
2014/01/12 职场文书
《那片绿绿的爬山虎》教学反思
2014/02/27 职场文书
元旦晚会感言
2014/03/12 职场文书
简单租房协议书范本
2014/08/20 职场文书
出国签证在职证明
2014/09/20 职场文书
教师求职简历自我评价
2015/03/10 职场文书
2015年基层党建工作总结
2015/05/14 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
python程序的组织结构详解
2021/12/06 Python
Linux中如何安装并部署Redis
2022/04/18 Servers