annotate default/node_modules/shoestring/README.md @ 0:1d038bc9b3d2 default tip

Up:default
author Liny <dev@neowd.com>
date Sat, 31 May 2025 09:21:51 +0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
1 # Shoestring
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
2
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
3 [![Filament Group](http://filamentgroup.com/images/fg-logo-positive-sm-crop.png) ](http://www.filamentgroup.com/)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
4
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
5 A lightweight, simple DOM utility made to run on a tight budget.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
6
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
7 Shoestring is part of the [Southstreet workflow](https://github.com/filamentgroup/southstreet) at Filament Group.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
8
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
9 You can find more details in the [API documentation](http://filamentgroup.github.io/shoestring/dist/docs/).
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
10
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
11 [![Build Status](https://travis-ci.org/filamentgroup/shoestring.svg?branch=master)](https://travis-ci.org/filamentgroup/shoestring) [![devDependency Status](https://david-dm.org/filamentgroup/shoestring/dev-status.svg)](https://david-dm.org/filamentgroup/shoestring#info=devDependencies)
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
12
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
13 ## Philosophy
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
14
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
15
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
16 Shoestring is a lightweight, modular DOM framework intended for developers who need their code to download and run as fast as possible. It is intended to be "just enough" of a tool to efficently write maintainable cross-browser JavaScript. The API is modeled after jQuery but we intentionally implement a tiny subset of the API to cover only the methods we commonly need in our projects. Each feature is built as an optional extension to a minimal core so each can be removed from the production build (dependencies between extensions are rare). The selector engine delegates to modern browsers' native `document.querySelectorAll` (IE8) and `addEventListener` (IE9), which means it requires browsers that support those features. For projects that require deeper compatibility or a richer set of features, it is simple to swap in jQuery instead. As a rule, anything that works with Shoestring should work with jQuery, but not the converse.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
17
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
18 Our goal is to strike a good balance of code weight, runtime speed, browser support, and developer convenience.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
19
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
20
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
21 ## Features
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
22
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
23 Shoestring's API is inspired by jQuery.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
24
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
25 Technically, shoestring.js is a very small, extendable core function. That core function doesn't come with much more than a means of finding and/or generating HTML elements, a DOM-ready handler, and a few essential element-traversal methods like `each`, `find`, `children`. Using its `shoestring.fn` API, its core is easy to extend further, and many extensions are available for you to include in your build – the default build includes all extensions, but it's still very small (~3kb compressed).
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
26
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
27 If you are concerned about compatibility issues/pitfalls consider using the development build releases (`-dev` in the [releases](https://github.com/filamentgroup/shoestring/releases)). We've endeavored to throw exceptions where a particular invocation pattern or feature isn't supported as a means to document the disparity. We recommend that you use the development version in development and the regular non-`-dev` version in production.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
28
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
29 There are three sets of extensions to the Shoestring core: DOM manipulation, events, and ajax.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
30
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
31 ### DOM
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
32
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
33 If you've used jQuery, the structure and behavior of the DOM manipulation methods will be immediately familiar:
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
34
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
35 ```javascript
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
36 shoestring( ".foo" ).addClass( "bar" ).attr( "data-baz", "bak" );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
37 ```
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
38
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
39 That is, construct a sequence of elements from the DOM and invoke each method on all the elements of the sequence in turn. You can find a full list of the supported DOM methods and their arguments in the [API docs](http://filamentgroup.github.io/shoestring/dist/docs/) under the `dom/*` subdirectory.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
40
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
41 ### Events
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
42
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
43 Shoestring supports most of the jQuery events API including: custom events that bubble, event namespaces, a normalized event object, event arguments, DOM Ready, a `.one` method, comprehensive `.unbind`, etc. The major difference here is that Shoestring does not support the event delegation helpers built into jQuery, like `.delegate` or `.on` with a selector argument.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
44
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
45 ```javascript
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
46 shoestring( ".foo" ).bind( "click", function( event ) { ... });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
47 ```
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
48
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
49 Or with a custom event triggered on a child element:
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
50
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
51
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
52 ```javascript
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
53 shoestring( ".foo" ).bind( "bar", function( event, arg ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
54 ...
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
55 if(arg == 1) { ... }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
56 ...
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
57 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
58
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
59 // ...
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
60
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
61 shoestring( ".foo" ).children().first().trigger( "bar", 1 );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
62 ```
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
63
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
64 You can find a full list of the supported event methods and their arguments in the [API docs](http://filamentgroup.github.io/shoestring/dist/docs/) under the `events/*` subdirectory.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
65
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
66
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
67 ### Ajax
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
68
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
69 Shoestring supports a full `shoestring.ajax` method as well as some shorthand helpers like `shoestring.get` and `shoestring.post`.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
70
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
71 ```javascript
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
72 shoestring.ajax( "/foo", {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
73 success: function(){ ... },
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
74 method: "GET",
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
75 ...
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
76 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
77 ```
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
78
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
79 Which could also be accomplished using `shoestring.get`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
80
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
81 ```javascript
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
82 shoestring.get( "/foo", function(){ ... });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
83 ```
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
84
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
85 You can find a full list of the supported ajax methods and their arguments in the [API docs](http://filamentgroup.github.io/shoestring/dist/docs/) under the `ajax/*` subdirectory.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
86
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
87
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
88 ## Extensions
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
89
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
90 Extending Shoestring is done in nearly the same fashion as jQuery. There is an object on which you can define properties using functions and those functions will have access to the Shoestring DOM element sequence during invocation using `this`. As an example the `remove` method:
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
91
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
92 ```javascript
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
93 /**
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
94 * Remove the current set of elements from the DOM.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
95 *
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
96 * @return shoestring
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
97 * @this shoestring
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
98 */
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
99 shoestring.fn.remove = function(){
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
100 return this.each(function(){
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
101 if( this.parentNode ) {
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
102 this.parentNode.removeChild( this );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
103 }
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
104 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
105 };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
106 ```
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
107
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
108 It uses the `each` method to handle the DOM elements in the current sequence in turn.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
109
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
110 **NOTE** these definitions must be made before a Shoestring object that depends on them is constructed. This is in contrast with jQuery where each object has access to new methods through the prototype chain.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
111
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
112 ### Modules
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
113
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
114 Each extension to Shoestring included in the repository is defined as an AMD module, but only for build purposes. We don't support, or plan to support, loading the library as modules in the browser.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
115
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
116 ```javascript
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
117 //>>excludeStart("exclude", pragmas.exclude);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
118 define([ "shoestring", "dom/remove" ], function(){
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
119 //>>excludeEnd("exclude");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
120
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
121 shoestring.fn.foo = function(){ ... };
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
122
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
123 //>>excludeStart("exclude", pragmas.exclude);
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
124 });
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
125 //>>excludeEnd("exclude");
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
126 ```
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
127
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
128 Note that the AMD wrapper is removed during the process of the build and that the dependencies are defined from the `src` subdirectory. More on custom builds below.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
129
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
130 ### Dependencies
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
131
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
132 Browsing the modules in Shoestring you'll notice that very few have explicit dependencies in their module definitions. This is by design. We are interested in being able to select the minimum number of methods necessary for a given project to reduce load and parse times.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
133
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
134 ## Builds
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
135
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
136 Shoestring releases include two different builds, one for development and one for production. The development build is larger. It is intended to help with jQuery compatibility issues and includes other development utilities like the method tracker. The production build is meant to be shipped in production and does not include the extra dev-time helpers.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
137
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
138 ### Custom
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
139
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
140 This repository supports custom builds through creating a meta-module in the `build/custom/` directory and running the default Grunt task. To get started building a custom production build, do the following:
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
141
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
142 1. make sure the project dependencies are installed with `npm install`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
143 2. copy `build/development.js` to `build/custom/foo.js`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
144 3. run `grunt` or `node node_modules/.bin/grunt`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
145 4. use `dist/foo.js`
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
146
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
147 ### Tracker
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
148
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
149 Included in the development build is a method tracker. It works by proxying all calls to `shoestring.fn` methods through a corresponding method that records the invocation in local storage. **NOTE** this does not include methods defined on `shoestring`. Then the methods being used across pages by your application can be inspected.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
150
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
151 ```javascript
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
152 JSON.parse( window.localStorage.getItem(shoestring.trackedMethodsKey) );
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
153 ```
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
154
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
155 If the method tracker is included during a significant portion of development this list can be used to remove unused functions from your Shoestring build with a custom meta-module.
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
156
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
157 ## Contributing
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
158
1d038bc9b3d2 Up:default
Liny <dev@neowd.com>
parents:
diff changeset
159 Please see the [contribution guidelines](CONTRIBUTING.md).