Giter VIP home page Giter VIP logo

router-extras-module's Introduction

@nuxtjs/router-extras

npm version npm downloads Circle CI Codecov License

Extra add-ons for Nuxt 2 router

Demo: https://codesandbox.io/s/github/nuxt-community/router-extras-module

๐Ÿ“– Release Notes

Nuxt 3

Looking for a Nuxt 3 alternative? Use the core composable definePageMeta.

Example:

<script setup>
definePageMeta({
  path: '/posts',
  alias: ['/articles', '/blog']
})
</script>

Features

  • Define custom paths for a page
  • Define multiple aliases for a single page
  • Define multiple params regardless of pages directory structure

Setup

  1. Add @nuxtjs/router-extras dependency to your project
yarn add --dev @nuxtjs/router-extras # or npm install --save-dev @nuxtjs/router-extras
  1. Add @nuxtjs/router-extras to the buildModules section of nuxt.config.js

โš ๏ธ If you are using Nuxt < 2.9.0, use modules instead.

{
  buildModules: [
    // Simple usage
    '@nuxtjs/router-extras',

    // With options
    ['@nuxtjs/router-extras', { /* module options */ }]
  ]
}

Using top level options

{
  buildModules: [
    '@nuxtjs/router-extras'
  ],
  routerExtras: {
    /* module options */
  }
}

Options

routerNativeAlias

  • Default: true

Simple aliases will be added as router alias, see vue-router

Usage

Define custom paths for a page

Simply add a block inside Vue file and define a path in JavaScript or Yaml

JavaScript
<router>
  {
    path: '/posts'
  }
</router>
Yaml
<router>
  path: /posts
</router>

Define multiple aliases for single page

If you want more paths for a single page, define them with aliases

JavaScript
<router>
 {
    path: '/posts',
    alias: [
      '/articles',
      '/blog'
    ]
 }
</router>
Yaml
<router>
    path: /posts
    alias:
        - /articles
        - /blog
</router>

Aliases can have their own props

JavaScript
<router>
  {
    path: '/posts',
    alias: [
      '/articles',
      {
        path: '/blog',
        props: {
          section: 'top-posts'
        }
      }
    ]
  }
</router>
Yaml
<router>
  path: /posts
  alias:
      - /articles
      - 
        path: /blog
        props:
          section: top-posts
</router>

Define multiple params regardless of pages directory structure

JavaScript
<router>
  {
    path: '/post/:id/:title?'
  }
</router>
Yaml
<router>
  path: /post/:id/:title?
</router>

Define named views for the page

JavaScript
<router>
{
  namedViews: {
    currentView: 'main',
    views: {
      side: '~/components/side.vue'
    },
    chunkNames: {
      side: 'components/side'
    }
  }
}
</router>
Yaml
<router>
  namedViews:
    currentView: "main"
    views:
      side: "~/components/side.vue"
    chunkNames:
      side: "~/components/side.vue"
</router>

Valid Extras

Extras Support Description
path JS & YAML Change page URL
alias JS & YAML Add single or multiple aliases to page, Module supports two types of aliases
- Simple Alias: These aliases are defined as simple strings. If routerNativeAlias is true, simple aliases will be added as router alias, see vue-router docs
- Clone Alias: These aliases are in form of object and they can have their own extras. These aliases will be added as an individual route. They can have their own props and they can have different number of url params
meta JS & YAML Add Meta information to the page, meta can be used by middlewares
name JS & YAML Define custom name for route
props JS & YAML Pass predefined props to page
beforeEnter JS Define beforeEnter guard for this route, see: Global Before Guards
caseSensitive JS & YAML Use case sensitive route match (default: false)
redirect JS & YAML Redirect current page to new location
namedViews JS & YAML Add named view to the path, see Named Views Support

Named views support

There is support for named views in nuxt, but it requires the user to write a lot of boilerplate code in the config. The namedViews property in the <router> block allows for a more streamlined configuration

Named views key is a bit different from all other settings. It expects an object with following properties:

  • currentView: actual view name for the current component. Defaults to "default", to be rendered in plain <nuxt-child />
  • views: object, where keys are view names and values are component paths. It supports all expected path resolution (~/ and others)
  • chunkNames: object, where keys are view names and values are webpack chunks for them. Object structure is expected to be equal to views - all the same keys must be present.

For usage example see example/pages/namedParent.vue and example/pages/namedParent/namedChild.vue.

Syntax Highlighting

Visual Studio Code

Install Vetur extension and define custom block

  • Add <router> to vetur.grammar.customBlocks in VSCode settings
"vetur.grammar.customBlocks": {
    "docs": "md",
    "i18n": "json",
    "router": "js"
}
  • Execute command > Vetur: Generate grammar from vetur.grammar.customBlocks in VSCode
  • Restart VSCode and enjoy awesome

PhpStorm/WebStorm

  • Place cursor right after tag
  • Right click on cursor and choose "Show context actions"
  • Select Inject language or reference
  • Select "JSON5" for JavaScript or "Yaml" for YAML

Development

  • Clone this repository
  • Install dependencies using yarn install or npm install
  • Start development server using npm run dev

License

MIT License

Copyright (c) Nuxt Community

router-extras-module's People

Contributors

ahadbirang avatar aldarund avatar atinux avatar bnabriss avatar cron13 avatar dependabot[bot] avatar farnabaz avatar harlan-zw avatar icehaunter avatar pi0 avatar renovate-bot avatar renovate[bot] avatar ricardogobbosouza avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

router-extras-module's Issues

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Repository problems

These problems occurred while renovating this repository. View logs.

  • WARN: Using npm packages for Renovate presets is now deprecated. Please migrate to repository-based presets instead.

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

circleci
.circleci/config.yml
npm
package.json
  • chokidar ^3.5.2
  • gray-matter ^4.0.3
  • @commitlint/cli 12.1.4
  • @commitlint/config-conventional 12.1.4
  • @nuxtjs/eslint-config 6.0.1
  • @nuxtjs/module-test-utils 1.6.3
  • bootstrap 5.1.1
  • bootstrap-vue 2.21.2
  • eslint 7.32.0
  • husky 6.0.0
  • jest 27.1.1
  • nuxt-edge ^2.14.7-26712039.c75ac80f
  • standard-version 9.3.1

  • Check this box to trigger a request for Renovate to run again on this repository

FATAL: The 'request' argument must be string. Received type undefined

I'm using nuxt with element-ui directly from the nuxt-create
added the router-extras module to my nuxt config:

modules: [
		"@nuxtjs/axios",
		"@nuxtjs/pwa",
		"@nuxtjs/router-extras"
		[
			"nuxt-i18n",
			{
				//i18n stuff
			}
		]
	],

When I run yarn dev, I get FATAL The 'request' argument must be string. Received type undefined and โœ– Nuxt Fatal Error. TypeError [ERR_INVALID_ARG_TYPE]: The 'request' argument must be string. Received type undefined

I've only done this so far, did I mess up something or it's a bug?

I'm running nuxt 2.7.1

A better name for this module?

First I want to thank you for this module. It helps tremendously for our project organisation, because we have several hundred pages divided into several teams. The ability to change the path of each page and aliases outside the file hierarchy helps us keep our sanity.

However I did not understand this module initially, probably because the name is "extra" and that does not immediately ring the bell of what it is and how it is useful.

Perhaps you want to rename the module to nuxt-router-permalinks or something similar? That will make the function of assigning a "permalink" to a page more clear, like how we normally use the term in Wordpress or other CMS.

[Feature Request] Allow path to be a function

So that when generating a static site for different locales, we can change the url the page.

Example syntax:

<router>
 {
    path () {
        if (this.$store.state.locale === "en") {
           return "/about"
        }
        if (this.$store.state.locale === "es") {
           return "/acerca"
        }
    }
 }
</router>

Dynamic Page Path from API's response attribute

If the API responses the pageURL as a part of the JSON, how can we use that to create the page path with this API's data ?
Is it possible to do something like this below ??

    ...
  </div>
</template>

<router>
 {
    path: page.pageURL,  // Somehow ??
 }
</router>

<script>
export default {
  name: 'Page',
  async asyncData ({ params, $axios, payload }) {
    if (payload) return { page: payload }
    const page = await $axios.$get(`http://api.mydomain.gr/pages/${params.page}`)
    return { page }
  },
  ...

How to enable passing route params as props?

I'm migrating a Vue CLI app to Nuxt.js and all my router level components are now page components on Nuxt.js.

The problem I'm having is that all router level components accept props based on the route params. Like what's explained here: https://router.vuejs.org/guide/essentials/passing-props.html#boolean-mode

Is there a way to quickly enable this behaviour in Nuxt.js using this module?
I tried installing and adding it to the buildModules key, but I was still getting the Missing required prop error on my page component.

Is it possible to use this to somehow rename the index.vue (homepage, "/") file to something else?

I'm working on a project with a weird requirement: the gallery of projects is titled "index" and the slug needs to be /index. But obviously there's a index.vue file in the /pages directory that corresponds to the / route.

So I'm trying to find a solution where I can maybe rename the index.vue file to home.vue or something or where I can create a projects.vue file and have the slug /index map over to said projects.vue file.

Nuxt 3 Support

Hi ๐Ÿ‘‹ It looks like this module hasn't been updated for Nuxt 3. In an effort to improve the developer experience of modules, I've updated the module to clarify that it only supports Nuxt 2.

If Nuxt 3 support is added it will be moved to the https://github.com/nuxt-modules organisation.

Alternatives:

@farnabaz Is Nuxt 3 support something you have planned? If not, perhaps we can archive this module?

Please let us know and thanks for your work!

Router push to an aliased component name

Hi !
I was wondering if we can somehow push to a component that does have this config

<router>
 {
    path: '/new-order/add-beneficiaries',
    alias: [
      '/new-order/suspend-beneficiaries',
    ]
 }
</router>

with something like this.$router.push({ name: 'new-order-suspend-beneficiaries' })

Not sure if I quite get the docs here but the Vue tools are not showing it in the router tab.

Invalid regular expression flag

Does anyone know what might be causing this error?

output

18:53:01 โœ” Nuxt files generated
webpackbar 18:53:02 โ„น Compiling Server
webpackbar 18:53:02 โ„น Compiling Client
webpackbar 18:53:02 โœ” Server: Compiled with some errors in 548.58ms

webpackbarfriendly-errors  18:53:0318:53:03  โœ” ERROR  Client: Compiled with some errors in 917.00ms
 Failed to compile with 1 errors


friendly-errors friendly-errors18:53:03 18:53:03  ERROR  Module parse failed: Invalid regular expression flag (9:7)
 in ./pages/v1/admin/index.vue?vue&type=custom&index=0&blockType=router

You may need an appropriate loader to handle this file type.
| 
| 
> path: /v1/admin
| name: dashboard
| 
friendly-errors 18:53:03 
 @ ./pages/v1/admin/index.vue?vue&type=custom&index=0&blockType=router 1:0-190 1:206-209 1:211-398 1:211-398
 @ ./pages/v1/admin/index.vue
 @ ./.nuxt/router.js
 @ ./.nuxt/index.js
 @ ./.nuxt/client.js
 @ multi eventsource-polyfill webpack-hot-middleware/client?reload=true&timeout=30000&ansiColors=&overlayStyles=&name=client&path=/__webpack_hmr/client ./.nuxt/client.js
friendly-errors 18:53:03 

index.vue

<template lang="html">
    <div class="">
      DASHBOARD

    </div>
</template>

<router>
  path: /v1/admin
  name: dashboard
</router>

<script>
export default {}
</script>

<style lang="css">
</style>

nuxt.config.js

{
  ...,
  /*
  ** Nuxt.js modules
  */
  modules: [
    // Doc: https://axios.nuxtjs.org/usage
    '@nuxtjs/axios',
    // Doc: https://github.com/nuxt-community/redirect-module
    '@nuxtjs/redirect-module',
    // Doc: https://github.com/nuxt-community/auth-module
    '@nuxtjs/auth',
     // Doc: https://github.com/nuxt-community/router-extras-module
    '@nuxtjs/router-extras',
  ],
  ...
}

I assume I goofed something simple up since it would seem that the module either isn't loading properly, or it's broken, of which the former seems most likely.

Thanks in advance!

[Request] Add support for named views

Currently, if one wants to use named views in nuxt, it is required to alter the router config within the nuxt.config.js file.

As this module allows the user to generally bypass the need to directly modify the router property for common use-cases, I think it would be awesome, if it would be possible to add named components within the <router> tag.

There are multiple things to consider:

  • Name and usage of the main component
  • Names and discovery of any named components
  • Chunk names

I think it could be reasonably resolved with the following API if the component resolution path is handled properly:

{
  namedViews: {
    currentComponentName: 'string', // 'default' by default
    views: {
       top: '~/components/Top.vue'
    },
    chunkNames: {
      top: 'components/Top'
    }
  }
}

Thank you very much for a very convenient library!

Dynamic Regex in path

Hi. in my project IDs are UUID hash, so I defined related regex for :id dynamic parameter in path. something like that:

<router lang="js">
  {
    path: '/foo/:id([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})'
  }
</router>

but my problem is that I don't want repeat this regex in pages path everytime. instead want define the regex once in a const and then import it wherever I need. How could this be possible?

Thanks

Please add documentation for routerNativeAlias (= false)

routerNativeAlias is still useful option even native aliases exists

vue-router alias only support aliases with equal number or parameters.
Which doesn't cover all cases

Eg. I have one page with optional filters, defined by $route params
page is matched againsts multiple routes

/:customer/explore/keywords
/:customer/explore/campaigns/:campaign/keywords
/:customer/explore/campaigns/:campaign/ad-groups/:adGroup/keywords

this is not easily possible with default nuxt router. Also aliases don't help here.
But router-extras-module with aliases routerNativeAlias=false works perfectly in this case.
(other options is declare routes manually, but it's pain i want to avoid)

Router extras not working with Nuxt v2.5.1

Recently I was update Nuxt from 2.4.5 to 2.5.1, but it failed, since I use this package.

Here the full of stack trace..

ReferenceError: meta is not defined
  at ModuleContainer.addModule (node_modules/@nuxt/core/dist/core.js:174:28)
  at promise.then (node_modules/@nuxt/utils/dist/utils.js:1724:43)
  at process._tickCallback (internal/process/next_tick.js:68:7)
  at Function.Module.runMain (internal/modules/cjs/loader.js:744:11)
  at startup (internal/bootstrap/node.js:285:19)
  at bootstrapNodeJSCore (internal/bootstrap/node.js:739:3)

Wants to update nuxt router extras to beta.0, but it's not available yet on npm. Any solution?

Alias route whit locale path

Hello!
I'm trying to reuse an existing route simply redefining it's nesting path.
So this is what I have done:

In my existing page that responds to the path /path1/:id1/path2/:id2:

<router>
  {
    alias: [
      '/path3/:id1/path4/:id2',
    ]
  }
</router>

Compiling it, I can see that the alias is associated in the existing path.. but calling the alias page I get an error 404 (existing page works well).

I'm using also nuxt-i18n module that always prepends the lang code to the url path.

Where I'm wrong? Thank you

[bug]Not Work with native vue-router router-link

const routerContentMatch = content.match(/<router([^>]*)>([\S\s.]*?)<\/router>/)
if (routerContentMatch) {
const [, attrs, content] = routerContentMatch
return {
content,
attrs
}
}
return null
}

because of /<router([^>]*)>([\S\s.]*?)<\/router>/, also work with <router-link>
so routerContentMatch get incorrect content

example

<template>
  <div>
    <router-link to="path">
      some-path-name
    </router-link>  
  </div>
</template>
<router>
  meta:
    name: foo
</router>

notice: <router([^>]*)> match <router-link> ,or may be <router-view>

image

well,yes i can use nuxt-link instead of router-link,to avoid this bug

but i think should support native vue-router component, right?

windows environment Unable to update automatically router.js

@nuxt/router-extras/lib/extras.js

function invalidateRoute (file) {
  const routes = localRoutes.filter(route => route.component === file)
  console.log(localRoutes[0].component) // => print like "D:\\hyp-test\\nuxt-test\\pages\\Home.vue"
  console.log(file) // =>  print like "D:\hyp-test\nuxt-test\pages\Home.vue"
  /* istanbul ignore next */
  if (!routes.length) {
    return false
  }

  const extras = extractExtrasFromRoute(routes[0], false)

  return extras._needUpdate
}

// Should need
const routes = localRoutes.filter(route => normalize(route.component) === normalize(file))

$router.resolve().href not working exactly

When i set path for page and use $router.resolve(), href just give me only path and remove all params

My router define

<router>
  {
    path: '/sd/:id'
  }
</router>

My code to view info of route

console.log(this.$router.resolve({name: 'product-detail-id', params: {id: 1111}}));

And console result

href: "/sd"
location:
    name: "product-detail-id"
    params:
        id: 1111

anyone help me!!!

Thanks you very much.

[Feature request] Use data in route

Right now I can

<router>
  {
    name: 'my customized name'
  }
</router>

Wonder if it is easy for me to inject name from data, e.g.

<router>
  {
    name: this.mySpecialName
  }
</router>

<script>
export default {
  data() {
    return {
      mySpecialName: 'my customized name'
    };
  }
}
</script>

and potentially mount mySpecialName by an API call?

Enabling to redefine alias name prop

Please modifiy the order:

from:

function mapObjectAliases (route, aliases) {
  return aliases.map(alias => Object.assign({}, route, {
    ...pick(alias, NUXT_VALID_EXTRAS),
    path: alias.path,
    name: `${route.name}${alias.path}`
  }))
}

to:

function mapObjectAliases (route, aliases) {
  return aliases.map(alias => Object.assign({}, route, {
    name: `${route.name}${alias.path}`,
    ...pick(alias, NUXT_VALID_EXTRAS),
    path: alias.path
  }))
}

How to redirect?

I want to redirect to a "default child" โ€“ instead of renaming to index.vue like usual (super large project, so it's important to keep a good filename).

When going to /sub/ it should be redirected to /sub/abc/, but it does not.
What am I doing wrong?

This appears super simple but doesn't work.

- sub.vue
- sub/abc.vue

sub.vue

<template>
  You are in: sub

  <nuxt-child/>
</template>

<router>
  {
    redirect: '/sub/abc'
  }
</router>

[Feature request] Supporting JS/JSON

Hi @farnabaz

Could it be nice to also support JSON for the <router> block?

I think here we can use a parse method that check if the first char is { and the last one } to parse it as JSON, otherwise fallback to YAML: https://github.com/nuxt-community/router-extras-module/blob/master/lib/extras.js#L88

I have a preference for JSON since most of JavaScript developers knows the syntax and lower the learning curve of this module.

Ideally, supporting JS will be a bonus:

<router>
{
  name: 'my-name'
}
</router>

I believe using a package like gray-matter for it would be a perfect fit.

Example of supporting JavaScript: https://github.com/jonschlinkert/gray-matter/blob/HEAD/examples/javascript.js

I'd like to ignore the auto-generated route of the page I am using the router extras in

Say I have a page example.vue with the following <router> property:

<router>
  alias:
  - path: '/event/:id'
  - path: '/:username/:eventName/:eventCount'
</router>

My generated router.js looks like:

{
    path: '/example',
    component: _4e18dbd1,
    name: 'example',
},
{
    path: '/event/:id',
    component: _4e18dbd1,
    name: 'example/event/:id',
},
{
    path: '/:username/:eventName/:eventCount',
    component: _4e18dbd1,
    name: 'example/:username/:eventName/:eventCount',
},

Is it possible to remove the /example route altogether? Or is the expected solution to this to create an example/event/_id.vue file with the router logic placed in there?

Define routes in mixin?

I have two pages for the mobile version and for the desktop, and there is also a mixin with logic for these pages. Can I define routes in this mixin and then use this data in <router></router>?

SyntaxError: Unexpected identifier

i delete .nuxt node_modules package-lock same error i have no idea i also added it to transpile

ATAL  SyntaxError: Unexpected identifier                            16:51:25

  at parse (node_modules/gray-matter/lib/engines.js:48:13)
  at Object.parse (node_modules/gray-matter/lib/engines.js:46:16)
  at module.exports (node_modules/gray-matter/lib/parse.js:12:17)
  at parseMatter (node_modules/gray-matter/index.js:109:17)
  at matter (node_modules/gray-matter/index.js:50:10)
  at extractExtrasFromRoute (node_modules/@nuxtjs/router-extras/lib/extras.js:88:20)
  at async extendRoutes (node_modules/@nuxtjs/router-extras/lib/extras.js:19:20)
  at async Nuxt.callHook (node_modules/hable/lib/hookable.js:50:7)
  at async Builder.resolveRoutes (node_modules/@nuxt/builder/dist/builder.js:5801:5)
  at async Promise.all (index 1)
  at async Builder.generateRoutesAndFiles (node_modules/@nuxt/builder/dist/builder.js:5662:5)
  at async Builder.build (node_modules/@nuxt/builder/dist/builder.js:5585:5)
  at async Object._startDev (node_modules/@nuxt/cli/dist/cli-dev.js:84:5)
  at async Object.startDev (node_modules/@nuxt/cli/dist/cli-dev.js:48:20)
  at async Object.run (node_modules/@nuxt/cli/dist/cli-dev.js:43:5)
  at async NuxtCommand.run (node_modules/@nuxt/cli/dist/cli-command.js:2567:7)


   โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
   โ”‚                                                     โ”‚
   โ”‚   โœ– Nuxt Fatal Error                                โ”‚
   โ”‚                                                     โ”‚
   โ”‚   SyntaxError: SyntaxError: Unexpected identifier   โ”‚
   โ”‚                                                     โ”‚

node version 12.5.0
nuxt 2.9.2
Macos

thanks

[Feature request] displayName aside of name

Is it possible to define

<router>
  {
    name: 'my unique customized name',
    displayName: 'My Display Name'
  }
</router>

as by using name I cannot have duplicated names? Imaging that I have multiple pages name "settings" for various different proposes, when I am generating a navigation bar I have no need to specify them (as what setting it belongs to can be found from the other part of the navigation bar). However, if I call all of them "settings" I'll get an error:

 WARN  [vue-router] Duplicate named routes definition: { name: "Settings", path: "/path/to/some/settings" }

and potentially I may confuse nuxt in <nuxt-link> block if I use name.

Thanks!

How to config eslint?

I've been trying to setup eslint to analyse my code, but I don't know how.

image

ESLint doesn't work in router block.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.