6.3.0-beta1 • Published 8 years ago

instapack v6.3.0-beta1

Weekly downloads
84
License
MIT
Repository
github
Last release
8 years ago

instapack

All-in-one web application client project compiler using TypeScript and Sass! :package: :rocket:

npm Build Status Build status Greenkeeper badge

Screenshot

Install

Machine-Wide (simpler and convenient)

npm install -g instapack

If you encounter errors during installation, try:

  • Using shell as Administrator or elevated privileges (sudo), clear the npm cache: npm cache clean --force and then: npm install -g instapack --no-optional

  • Or downgrade to npm 4 to avoid buggy npm 5: npm install -g npm@4

  • Or use Yarn instead: yarn global add instapack

Per Project (consistent build)

npm install instapack@[version] -D -E or yarn add instapack@[version] -D -E then modify the project's package.json

{
  "scripts": {
    "build": "ipack"
  }
}

After that, npm run build or yarn run build

Programmable Node.js API is also provided if you wish to integrate instapack into your own build script.

Quick Start Guide

cd E:\VS\MyWebApp
ipack new empty
ipack

Out of the box, these files will be used as the program entry points:

  • client/js/index.ts compiled to wwwroot/js/ipack.js

    • Include this file in your HTML using <script> at the bottom / before </body> so the browser can render the page while downloading the script.

    • Anything imported from node_modules will be put into ipack.dll.js. Please also include this file in your HTML just before ipack.js

  • client/css/index.scss compiled to wwwroot/css/ipack.css

    • Include this file in your HTML using <link> at the top / before </head> so the browser can style and render the page as it loads.

    • Spiced :hot_pepper: with AutoPrefixer for applying CSS vendor-prefixes automatically!

  • Concatenate files listed in package.json (Read more ↓)

    • Usually the output file should be included in the HTML before ipack.js

Practical guides can be read in the books folder.

System Requirements

Currently supported Node.js is the latest version 8 LTS.

When using Visual Studio 2017 (Update 2 or above), install the latest TypeScript SDK for Visual Studio 2017.

When using Visual Studio 2015 (Update 3 or above), install the latest TypeScript SDK for Visual Studio 2015.

If using the latest Visual Studio Code, it should come with the latest TypeScript support out of the box.

Features

  • Hyper-opinionated web app client project builder with near-zero configurations. It just works. :sparkling_heart:

  • Built-in new project scaffold tool. :gift:

  • Rich debugging experience using DevTools: set breakpoints, view variable values, and step into the TypeScript source code directly in the browser! :mag:

Design Goals

  • Lower the barrier of entry for developing a modern web app. :angel:

  • Introduce structure to the app client source code. :office:

  • Improve source code quality and maintainability with type hints and compile-time checks. :eyeglasses:

  • Enforce best practices when building apps, which may significantly impact page load time. (e.g. bundling and minification) :airplane:

  • Unify team build system across multiple projects, for any frameworks. :fist:

  • Blur the boundary between design time and coding time using lightning fast watch + dev compilation mode. :zap:

But... Why?

Recently every hecking framework on this planet :earth_asia: has their own CLI, but only few are able to support TypeScript out of the box. So most people gave up on TypeScript right off the bat... :broken_heart:

instapack is an initiative to develop a command line tool for compiling most apps developed using mainstream JavaScript frameworks, with a :lemon: twist: It can easily build an app written in TypeScript with minimal or no further configurations!

Powered by webpack, instapack effortlessly devours modules written using modern JS standards (ES Harmony, CommonJS, AMD, UMD) and is capable of importing HTML templates out of the box. instapack is battle-tested :hocho: and is designed to cover most normal use cases when developing a modern web app.

With this powerful tool, you can save time :watch:, save precious SSD space :space_invader:, and save yourself from the pain of manually maintaining project build scripts! :coffee:

Commands

You may use instapack or ipack to invoke the command line interface.

new template

Scaffolds a new instapack project into your existing app folder where the command line is invoked. The following templates are available:

  • empty when you need a minimal clean slate. (Use this template to author new templates!)

  • vue when you want to develop a web app with Vue.js and Bootstrap 4. (Includes aspnet-validation for ASP.NET MVC client-side validation.)

  • react when you want to develop a web app with React and Semantic UI.

  • inferno when you want to develop a web app with Inferno and Bootstrap 4.

  • vue-mobile when you want to develop a Progressive Web Application using Vue.js and Onsen UI! (Cordova-compatible, read more on FAQ ↓)

  • angularjs when you need to develop a legacy web app with AngularJS 1.7 and Bootstrap 3. (Includes jquery-validation-unobtrusive for ASP.NET MVC client-side validation.)

If no template parameter is provided, vue will be chosen. :vulcan_salute:

build project

Performs compilation against selected project type. Available projects: all, js, css and concat. If no project parameter is provided, all will be chosen.

In addition, build flags are available:

  • --watch or -w enables automatic incremental build on source code changes. :robot:

  • --dev or -d disables build outputs optimization and minification for FAST build! :fire:

  • --xdebug or -x disables source maps, producing undebuggable outputs. (Slightly improves build speed)

  • --stats generates stats.json next to the TypeScript build outputs, which can be fed to webpack-bundle-analyzer or webpack-visualizer. For sanity, this flag will be ignored when using -d or -w flags.

You can combine multiple build flags, for example: ipack -dw = dev + watch mode for massive productivity gainz! :muscle:

clean

Remove all files in the output folders.

set

  • package-manager allows setting default package manager to be used for restoring and integrity-checking node_modules prior build. Possible values: yarn and npm

  • integrity-check allows disabling package restore prior build. Possible values: true and false

Configurations

instapack puts configurations inside package.json to reduce project files clutter. For example, this is the included package.json with vue template:

name, version, private, and dependencies fields were removed for brevity.

{
  "instapack": {
    "output": "wwwroot",
    "concat": {
      "vendor": [
        "es6-promise/dist/es6-promise.auto",
        "bootstrap.native/dist/polyfill",
        "bootstrap.native/dist/bootstrap-native-v4"
      ]
    },
    "alias": {
      "vue": "vue/dist/vue.common"
    }
  }
}
  • input allows setting the input folder name. By default, it is set to client

  • output allows setting the output folder name. By default, it is set to wwwroot

  • jsOut allows setting the JS output file name. By default, it is set to ipack.js

  • cssOut allows setting the CSS output file name. By default, it is set to ipack.css

  • alias allows overriding module import calls from all files, including dependencies. Read more ↗

    • TypeScript paths compiler option in tsconfig.json will be translated into aliases with caveats:

      • Due to technical limitations, only the first path in the string array will be honored!

      • "All modules" pattern * will not be honored because it dirties the packages namespace!

Packages are imported without relative paths, therefore * path turns all project modules into package imports. This can cause the project to be less maintainable or confusing...

  • externals allows rewriting module import calls from all files, including dependencies, to globally exposed objects via window object. Read more ↗

For example:

{
  "instapack": {
    "externals": {
      "jquery": "$"
    }
  }
}
// converts this...
import jQuery from 'jquery';

// into this...
// const jQuery = window["$"];

so CDN can be used! :tada:

<script src="https://unpkg.com/jquery@3.3.1/dist/jquery.js"></script>
  • concat allows packing browser libraries to be consumed directly from <script src="..."> rather than as a module.

    • The file names will be resolved node-style (but NOT their contents), which allows concatenating packages downloaded from npm to be bundled, minified, and then placed into the output JS folder.

    • Use concatenation for libraries that cannot be imported / do not need to be imported (for example, jQuery plugins). This hybrid approach allows excellent interop with older libraries!

    • For consuming the libraries within the TypeScript app code: include the concatenated file BEFORE the app bundle then...

      • Combo with the externals module configuration for easy import using require / CommonJS module syntax.

      • Alternatively (for strongly-typed import), write a TypeScript module declaration (declare module) then import using ES Modules syntax.

      • Possible but not recommended: reference the library objects directly from the window (e.g. window['$']).

Another concat configuration example: (produces vendor.js bundle, handy for ASP.NET MVC)

{
  "instapack": {
    "concat": {
      "vendor": [
        "jquery",
        "bootstrap",
        "jquery-validation",
        "jquery-validation-unobtrusive",
        "./client/lib/my-old-jquery-plugin"
      ]
    }
  }
}

Module Systems

TypeScript / ES Modules

Imports and exports other .ts / .tsx files in the project or normal JS modules from node_modules. This technique allows the ease of development using intellisense for modules with type definitions:

  • The module has "typings": "something.d.ts" in its package.json. For example: vue, linq

  • The module has @types installed. For example, react and @types/react

import List from 'linq';

When the imported module does not have any type definitions, it will be imported as any data type (no intellisense).

CommonJS / Node.js require

  • Easily imports ordinary JS modules within the project or from node_modules. However, you will NOT get intellisense! (Modules will be imported as any data type.)

  • Imports a static JSON file to be parsed as JS object.

let $ = require('jquery');
let settings = require('./settings.json') as ISettings;
  • Imports an .html file to be minified and then stringified. This technique is invaluable for working with frameworks relying on HTML-based templates such as AngularJS, mustache.js / Handlebars.js, and Vue.js:
let template = require('./mytemplate.html') as string;

CommonJS require method in TypeScript is provided through @types/requirejs package.

Use as type-hint for clarity and convenience.

Vue Pre-Compiled HTML Templates

In pursuit of greater app performance, instapack allows Ahead-of-Time (AoT) compilation of HTML templates using Vue.js render component options. HTML files with special file extension .vue.html will be imported as an object to be passed into Vue Component decorator as parameters:

import Vue from 'vue';
import Component from 'vue-class-component';
import { render, staticRenderFns } from './MyComponent.vue.html';

@Component({
    render, staticRenderFns
})
export class MyComponent extends Vue {
}

A global TypeScript definition file for *.vue.html module is required for importing a template using ES Modules syntax. That file will be created for you when using the vue new project template!

Sass @import

instapack also has a custom-made Node-like but standard-compliant Sass module system using @import syntax:

  • Include files relative to the source, which include _partial.scss files. (Standard Sass behavior)

  • Include files relative to the source in a named folder, but as index.scss or index.css

  • Include files, resolved from node_modules. Also reads package.json to locate the file in sass or style field!

Unlike Sass which ignores @import of files explicitly named with .css extension (which often caused confusion), instapack will pick up those files!

Release Cadence

Starting version 4.0.0, instapack follows Semantic Versioning.

Bi-weekly releases (usually on 14th and 28th date of each month) will be performed for updating package dependencies. Bug reports will be dealt promptly. These actions will increment the patch version.

New non-breaking features will increment the minor version. Breaking changes will increment the major version. View breaking changes here.

Occasionally, beta builds will be published (instapack@beta) for showcasing the bleeding edge version of the tool.

Alternatively, you may build directly from the source code repository:

git clone https://github.com/ryanelian/instapack.git
cd instapack
.\link.ps1
.\build.ps1
ipack --version

FAQ

Can I use insert_framework_name_here ?

Yes, absolutely! If it worked when using standard JavaScript, it WILL work with instapack!!

Add the packages required for your project using npm / Yarn and then start hacking. We'll take care of the outputs.

Also, pull requests are welcomed if you have a great starting templates and books for those projects. We'd love to expand our collections!

How to develop a Cordova app using vue-mobile template?

cordova create MyProject
cd MyProject
ipack new vue-mobile
cordova platform add android ios browser
yarn
ipack -dw               # then change www/index.html <script> and <link> tags.
cordova run browser     # re-run commmand every time build outputs change

CAUTION: cordova platform add and cordova plugin add (or remove) will destroy your node_modules. Re-run yarn / npm install after invoking those commands!

Alternatively, you can use phonegap serve for development due to Browsersync playing nice with instapack watch. You will need to remove / comment / edit the <meta http-equiv="Content-Security-Policy"> tag though.

Later on...

cordova build android
cordova build ios

I thought files should not be bundled because of HTTP/2?

Nope.

Also, in IIS, HTTP/2 is only supported when using Windows Server 2016. Many of our customers are still using Windows Server 2012 R2 to date.

Can I change the index.ts / index.scss entry point?

Nope.

Can I change the js / css folder name?

Nope.

My package restore / IDE is slow. Help!

Windows Defender or other anti-virus software appear to slow down package restore and IDEs when opening projects.

For this very reason, it is highly recommended to:

  • Add anti-virus exclusion to Yarn installation folder: C:\Program Files (x86)\Yarn. To double check, type: where.exe yarn

  • Add anti-virus exclusion to Yarn cache folder: C:\Users\Ryan\AppData\Local\Yarn. To double check, type: yarn cache dir

  • Add anti-virus exclusion to NodeJS installation folder: C:\Program Files\nodejs. To double check, type: where.exe node

  • Add anti-virus exclusion to %APPDATA%\npm and %APPDATA%\npm-cache folders.

  • Add anti-virus exclusion to Git installation folder: C:\Program Files\Git. To double check, type: where.exe git

  • Use very short root folder name for projects, such as D:\VS, to avoid potential problems with Windows system paths over 260 characters long. Then exclude the folder from the anti-virus.

Your PowerShell is cute. How to?

Set-ExecutionPolicy RemoteSigned -scope CurrentUser
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
scoop install concfg
concfg import firefly

For more information, visit http://scoop.sh/ and https://github.com/lukesampson/concfg

8.3.0

5 years ago

8.2.0

5 years ago

8.1.0

5 years ago

8.0.1

5 years ago

8.0.0

5 years ago

8.0.0-beta.14

6 years ago

8.0.0-beta.12

6 years ago

8.0.0-beta.11

6 years ago

8.0.0-beta.10

6 years ago

8.0.0-beta.8

6 years ago

8.0.0-beta.7

6 years ago

8.0.0-beta.6

6 years ago

8.0.0-beta.5

6 years ago

8.0.0-beta.4

6 years ago

8.0.0-beta.3

6 years ago

8.0.0-beta.2

6 years ago

8.0.0-beta.1

6 years ago

7.6.1

6 years ago

8.0.0-alpha.8

6 years ago

8.0.0-alpha.7

6 years ago

8.0.0-alpha.6

6 years ago

8.0.0-alpha.5

6 years ago

8.0.0-alpha.4

6 years ago

8.0.0-alpha.3

6 years ago

8.0.0-alpha.2

6 years ago

8.0.0-alpha.1

6 years ago

7.6.0

6 years ago

7.6.0-beta.4

6 years ago

7.6.0-beta.3

6 years ago

7.6.0-beta.2

6 years ago

7.6.0-beta.1

7 years ago

7.5.0

7 years ago

7.5.0-beta.1

7 years ago

7.4.0

7 years ago

7.4.0-beta.1

7 years ago

7.3.4

7 years ago

7.3.3

7 years ago

7.3.2

7 years ago

7.3.1

7 years ago

7.3.1-beta.2

7 years ago

7.3.1-beta1

7 years ago

7.3.0

7 years ago

7.3.0-rc.3

7 years ago

7.3.0-rc.2

7 years ago

7.3.0-rc.1

7 years ago

7.3.0-beta.3

7 years ago

7.3.0-beta2

7 years ago

7.2.9-beta1

7 years ago

7.2.8

7 years ago

7.2.7

7 years ago

7.2.6

7 years ago

7.2.5

7 years ago

7.2.4

7 years ago

7.2.4-beta2

7 years ago

7.2.4-beta1

7 years ago

7.2.3

7 years ago

7.2.2

7 years ago

7.2.1

7 years ago

7.2.1-beta1

7 years ago

7.2.0

7 years ago

7.2.0-beta4

7 years ago

7.2.0-beta3

7 years ago

7.2.0-beta2

7 years ago

7.2.0-beta1

7 years ago

7.1.3-beta1

7 years ago

7.1.2

7 years ago

7.1.2-rc.3

7 years ago

7.1.2-rc.2

7 years ago

7.1.2-rc.1

7 years ago

6.7.1

7 years ago

7.1.2-beta.2

7 years ago

7.1.1

7 years ago

7.1.1-beta.1

7 years ago

7.1.0

7 years ago

7.1.0-rc.1

7 years ago

7.1.0-beta2

7 years ago

7.1.0-beta1

7 years ago

7.0.1

7 years ago

7.0.1-rc2

7 years ago

7.0.1-rc1

7 years ago

7.0.1-beta5

7 years ago

7.0.1-beta4

8 years ago

7.0.1-beta3

8 years ago

7.0.1-beta2

8 years ago

7.0.1-beta1

8 years ago

7.0.0

8 years ago

7.0.0-beta5

8 years ago

7.0.0-beta4

8 years ago

7.0.0-beta3

8 years ago

7.0.0-beta2

8 years ago

7.0.0-beta1

8 years ago

6.7.0

8 years ago

6.7.0-rc2

8 years ago

6.7.0-rc1

8 years ago

6.7.0-beta3

8 years ago

6.7.0-beta2

8 years ago

6.7.0-beta1

8 years ago

6.6.1

8 years ago

6.6.1-beta2

8 years ago

6.6.1-beta1

8 years ago

6.6.0

8 years ago

6.6.0-beta2

8 years ago

6.6.0-beta1

8 years ago

6.5.4

8 years ago

6.5.3

8 years ago

6.5.3-beta1

8 years ago

6.5.2

8 years ago

6.5.2-beta2

8 years ago

6.5.2-beta1

8 years ago

6.5.1

8 years ago

6.5.1-beta.1

8 years ago

6.5.0

8 years ago

6.5.0-beta1

8 years ago

6.4.1-beta3

8 years ago

6.4.1-beta2

8 years ago

6.4.1-beta1

8 years ago

6.4.0

8 years ago

6.4.0-rc1

8 years ago

6.4.0-beta7

8 years ago

6.4.0-beta6

8 years ago

6.4.0-beta5

8 years ago

6.4.0-beta4

8 years ago

6.4.0-beta3

8 years ago

6.4.0-beta2

8 years ago

6.4.0-beta1

8 years ago

6.3.0

8 years ago

6.3.0-beta3

8 years ago

6.3.0-beta2

8 years ago

6.3.0-beta1

8 years ago

6.2.0

8 years ago

6.2.0-rc3

8 years ago

6.2.0-rc2

8 years ago

6.2.0-rc1

8 years ago

6.2.0-beta4

8 years ago

6.2.0-beta3

8 years ago

6.2.0-beta2

8 years ago

6.2.0-beta1

8 years ago

6.1.0

8 years ago

6.1.0-rc2

8 years ago

6.1.0-rc1

8 years ago

6.0.1-beta2

8 years ago

6.0.1-beta1

8 years ago

6.0.0

8 years ago

6.0.0-rc1

8 years ago

6.0.0-beta5

8 years ago

6.0.0-beta4

8 years ago

6.0.0-beta3

8 years ago

6.0.0-beta2

8 years ago

6.0.0-beta1

8 years ago

5.2.2-beta1

8 years ago

5.2.1

8 years ago

5.2.0

8 years ago

5.1.4-beta3

8 years ago

5.1.4-beta2

8 years ago

5.1.4-beta1

8 years ago

5.1.3

8 years ago

5.1.2

8 years ago

5.1.2-rc1

8 years ago

5.1.2-beta1

8 years ago

5.1.1

8 years ago

5.1.1-beta1

8 years ago

5.1.0

8 years ago

5.1.0-beta4

8 years ago

5.1.0-beta3

8 years ago

5.1.0-beta2

8 years ago

5.1.0-beta1

8 years ago

5.0.1-beta1

8 years ago

5.0.0

8 years ago

5.0.0-rc2

8 years ago

5.0.0-rc1

8 years ago

5.0.0-beta7

8 years ago

5.0.0-beta6

8 years ago

5.0.0-beta5

8 years ago

5.0.0-beta4

8 years ago

5.0.0-beta3

8 years ago

5.0.0-beta2

8 years ago

5.0.0-beta1

9 years ago

4.3.0-rc1

9 years ago

4.3.0-beta2

9 years ago

4.3.0-beta1

9 years ago

4.2.1-beta1

9 years ago

4.2.0

9 years ago

4.2.0-beta3

9 years ago

4.2.0-beta2

9 years ago

4.2.0-beta1

9 years ago

4.1.3-beta1

9 years ago

4.1.2

9 years ago

4.1.2-beta1

9 years ago

4.1.1

9 years ago

4.1.1-rc1

9 years ago

4.1.1-beta5

9 years ago

4.1.1-beta4

9 years ago

4.1.1-beta3

9 years ago

4.1.1-beta2

9 years ago

4.1.1-beta1

9 years ago

4.1.0

9 years ago

4.1.0-rc2

9 years ago

4.1.0-rc1

9 years ago

4.0.3-beta2

9 years ago

4.0.3-beta1

9 years ago

4.0.2

9 years ago

4.0.2-rc3

9 years ago

4.0.2-rc2

9 years ago

4.0.2-rc1

9 years ago

4.0.2-beta2

9 years ago

4.0.2-beta1

9 years ago

4.0.1

9 years ago

4.0.0-compat

9 years ago

4.0.0

9 years ago

4.0.0-rc4

9 years ago

4.0.0-rc3

9 years ago

4.0.0-rc2

9 years ago

4.0.0-rc1

9 years ago

4.0.0-beta6

9 years ago

4.0.0-beta5

9 years ago

4.0.0-beta3

9 years ago