parcel 是一个零配置的前端构建工具,相比webpack 更快,同时使用简单以下是
一个简单的使用typescript 开发vue 应用,同时使用parcel 构建,同时集成了docker
构建,代码很简单,同时会有一些碰到问题的解决

项目

说明parcel 是零配置的,我们基本不需要配置多少,基本都是自动的

  • 项目结构
 
├── Dockerfile
├── README.md
├── css
│ ├── index.css
│ └── login.css
├── docker-compose.yaml
├── images
│ └── app.png
├── index.html
├── nginx.conf
├── package.json
├── src
│ ├── app.vue
│ ├── app.vue.d.ts
│ ├── index.ts
│ └── user.js
├── tsconfig.json
├── types
│ └── vue.shims.d.ts
└── yarn.lock
  • 项目说明
    src 为代码,app.vue 为一个简单的vue 组件,app.vue.d.ts 是自动生成的typescript 定义(使用vuetype),index.ts 为入口,user.js 为
    一个es6的模块(主要是测试混合集成),css 以及image 为一些样式文件以及图片
  • 代码说明
    package.json
 
{
  "name": "first",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "devDependencies": {
    "@types/shortid": "^0.0.29",
    "@types/vue": "^2.0.0",
    "@vue/component-compiler-utils": "^3.0.2",
    "parcel-bundler": "^1.12.4",
    "sass": "^1.23.3",
    "typescript": "^3.7.2",
    "vue-template-compiler": "^2.6.10"
  },
  "scripts": {
    "start": "parcel index.html",
    "vue-type": "vuetype --watch src",
    "clean": "rm -rf build/mylogin",
    "build": "NODE_ENV=production npm run clean && parcel build --no-source-maps index.html --out-dir build/mylogin"
  },
  "dependencies": {
    "shortid": "^2.2.15",
    "vue": "^2.6.10",
    "vue-class-component": "^7.1.0",
    "vue-hot-reload-api": "^2.3.4",
    "vuetype": "^0.3.2"
  }
}

src/index.ts

import shortid from "shortid"
import { UserLogin } from "./user"
import Vue from "vue"
import App from "./app.vue"
class User {
    public id: string;
    public userLogin: UserLogin;
    constructor(public name: string, public age: number) {
        this.name = name;
        this.age = age;
        this.id = shortid.generate();
        this.userLogin = new UserLogin();
    }
    render() {
        // let that =this;
        window.onload = function () {
            // let token = that.userLogin.token;
            // let content=`${that.name}----${that.age}----${that.id}---${token}`
            new Vue(App).$mount('#content')
        }
    }
}
var user = new User("dalong", 333)
user.render()

src/user.js

import shortid from "shortid"
class UserLogin {
    constructor() {
        this.token = shortid.generate();
    }
    login() {
        console.log("login", this.token)
    }
}
export default UserLogin
export {
    UserLogin

src/app.vue

<template >
  <div class="container">Hello {{bundler}},token info {{token}}</div>
</template>
<script lang="ts">
import Vue from "vue";
import { UserLogin } from "./user";
import Component from "vue-class-component";
@Component
export default class App extends Vue {
  bundler = "demo";
  token = "";
  data() {
    return {
      bundler: "Parcel",
      token: new UserLogin().token,
      version: "v1"
    };
  }
}
</script>
<style lang="scss" scoped>
.container {
  color: green;
}
</style>

使用

  • 安装依赖
yarn
  • 生成组件ts 定义
yarn vue-type
  • live 模式运行
yarn start

效果

  • docker 运行
    dockerfile
 
FROM openresty/openresty:alpine
COPY nginx.conf /usr/local/openresty/nginx/conf/
COPY build/mylogin/ /usr/local/openresty/nginx/html/
EXPOSE 80
EXPOSE 443
EXPOSE 88

nginx 配置

worker_processes 1;
events {
    worker_connections 1024;
}
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    gzip on;
    gzip_min_length 2k;
    gzip_buffers 4 16k;
    gzip_comp_level 8;
    gzip_types text/plain text/css image/png application/javascript image/jpeg image/gif;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    server {
        listen 80;
        server_name localhost;
        charset utf-8;
        location / {
            root html;
            index index.html index.htm;
        }
        location /ip {
            default_type text/html;
            content_by_lua_block{
                ngx.say(ngx.var.remote_addr)
            }
        }
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root html;
        }
    }
}

docker-compose文件

version: "3"
services: 
  app:
    build: ./
    image: dalongrong/parcel-demoapp
    ports:
    - "80:80"
  • docker 运行
yarn build
docker-compose build
docker-compose up -d

几个问题

  • vue 组件import 提示无法找到
    解决方法:
 
使用vuetype 生成类型定义
或者添加 vue vue.shims.d.ts 
内容
declare module "*.vue" {
    import Vue from "vue";
    export default Vue;
}
同时tsconfig.json 添加
"typeRoots": [
     "./src"
      "./node_modules/vue/types",
 ],

参考资料

https://github.com/rongfengliang/parcel-learning
https://github.com/parcel-bundler/parcel
https://github.com/ktsn/vuetype
https://github.com/vuejs/vue/issues/5298
https://github.com/vuejs/vue-cli/issues/1198

vue+ typescript 使用parcel 构建的更多相关文章

  1. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

  2. almost最好的Vue + Typescript系列02 项目结构篇

    基于vue-cli 3.x,配合typescript的环境构建的新vue项目,跟以前的结构相比,有了一些变化,下面我们来简单的了解一下 基本结构: node_modules: 项目中安装的依赖模块 p ...

  3. vue源码分析—Vue.js 源码构建

    Vue.js 源码是基于 Rollup 构建的,它的构建相关配置都在 scripts 目录下.(Rollup 中文网和英文网) 构建脚本 通常一个基于 NPM 托管的项目都会有一个 package.j ...

  4. VUE2 第六天学习--- vue单文件项目构建

    阅读目录 VUE2 第六天学习--- vue单文件项目构建 回到顶部 VUE2 第六天学习--- vue单文件项目构建 VUE单文件组件在Vue项目中,然后使用 new Vue({el: '#cont ...

  5. Vue + TypeScript + ElementUI 封装表头查询组件

    前段时间有朋友私信我 Vue + TypeScript 的问题,然后就打算写一篇 Vue + TypeScript 封装组件的文章 正好公司项目中需要封装一个表头查询组件,就拿出来分享一下~ 组件的整 ...

  6. vue + typescript 项目起手式

    https://segmentfault.com/a/1190000011744210 2017-10-27 发布 vue + typescript 项目起手式 javascript vue.js t ...

  7. Vue+Typescript中在Vue上挂载axios使用时报错

    Vue+Typescript中在Vue上挂载axios使用时报错 在vue项目开发过程中,为了方便在各个组件中调用axios,我们通常会在入口文件将axios挂载到vue原型身上,如下: main.t ...

  8. 使用Vue-cli3搭建Vue+TypeScript项目

    一,创建项目 使用 npm 安装 vue-cli 3 和typescript npm i -g @vue/cli typescript 使用vue create命令快速搭建新项目的脚手架 vue cr ...

  9. Vue.js 源码构建(三)

    Vue.js 源码是基于 Rollup 构建的,它的构建相关配置都在 scripts 目录下. 构建脚本 通常一个基于 NPM 托管的项目都会有一个 package.json 文件,它是对项目的描述文 ...

随机推荐

  1. i2c的读写时序图

    根据实际示波器的波形画的时序图,时序图不好画,小小一幅图,画了两个小时,分享之:

  2. Vue.js 源码分析(十三) 基础篇 组件 props属性详解

    父组件通过props属性向子组件传递数据,定义组件的时候可以定义一个props属性,值可以是一个字符串数组或一个对象. 例如: <!DOCTYPE html> <html lang= ...

  3. 另一种缓存,Spring Boot 整合 Ehcache

    用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是有必要了解下 Ehcache ,在有的场 ...

  4. HTML CSS布局定位

    我们在编写网页代码时,首先应该做的就是设计好页面的布局形式,然后再往里面填充内容.网页布局的好与坏,直接决定了网页最终的展示效果.PC端常见的网页布局形式有两列布局.三列布局等.在CSS中,我们通常使 ...

  5. C# winform 启动外部程序

    //class里面放入这段代码[DllImport("shell32.dll")]public static extern int ShellExecute(IntPtr hwnd ...

  6. C# 文件操作总结

    一.需求分析 1.将信息记录到本地记事本中. 2.将记录的信息读取出来. 3.计算出某个文件夹下所有后缀名为txt的数量和dll的数量. 4.从网络上下载文件. 二.二话不说上代码 using Sys ...

  7. moodle3.7上传中文文件,无法引用,图片不显示

    初始安装moodle3.7 上传图片,名称为中文时,无法引用图片,图片不显示.这里采用修改moodle根目录下的config.php文件, 添加了变量$CFG->slasharguments = ...

  8. 活动任务出现bug

    之前做的一个活动任务发现一个bug,是以前和离职同事一起对逻辑的时候没有考虑到的,配置活动的时候应该要先查询下,如果这个产品线上在这段时间已经配置了并且上线了,则不能在做活动处理了,否则就和前面的活动 ...

  9. vue + yarn 创建项目

    前期准备工作node,npm,vue,yarn等环境要准备好 1.命令行vue init webpack myproject 2.使用vs code打开项目文件夹, vs终端运行一下yarn 3.添加 ...

  10. Unity3D协程(转)

    这篇文章转自:http://blog.csdn.net/huang9012/article/details/38492937 协程介绍 在Unity中,协程(Coroutines)的形式是我最喜欢的功 ...