dreamzmaster / gulp-sitespeedio Goto Github PK
View Code? Open in Web Editor NEWTest performance budgets and performance best practice rules using sitespeed.io http://www.sitespeed.io
License: MIT License
Test performance budgets and performance best practice rules using sitespeed.io http://www.sitespeed.io
License: MIT License
Hi!
First of all, congratulations for the port, it is been really useful in my projects!
However I'm facing a problem. sitespeed.io:3.x
uses internally browsertime:0.x
and it has a inner dependency (async-node-events
) that is downloaded from git:
https://github.com/sitespeedio/browsertime/blob/v0.12.3/package.json#L43
My CI runs through a proxy and can't download any external dependencies.
Fortunately this dependence was removed since browsertime:1.x-beta
, and sitespeed.io:4.x-beta
makes use of upgraded browsertime as well.
Could you make a secondary release in npm compatible with sitespeed.io:4.x-beta
?
If you need any help I'm available.
Thanks so far!
Right now the plugin shuts down when using urls option instead of the url option due to
if (!options.url) {
throw new PluginError('gulp-sitespeedio', 'Missing url option to Analyse');
}
Trying to run this on a local static site. Every time I run it (and I tried just using http://www.sitespeed.io) I get 0 passing, 0 failing. I was expecting the output to be the same as the output running sitespeed itself. However running through gulp I only get the budget.html and am missing the rest of the html, css, js, etc. Could you point me in the correct direction. My task below for reference:
gulp.task('speed-test', sitespeed({
url: 'http://127.0.0.1/',
deepth: 1,
resultBaseDir: 'test-results',
browser: 'chrome',
connection: 'desktop',
no: 6,
showFailedOnly: true,
budget: {
rules: {
default: 90
},
page: {
image: 10,
css: 1,
requests: 7,
pageWeight: 300000,
jsWeight: 0
},
gpsi: {
score: 96
}
}
}));
Lack of documentation:
If you need to specify any options you can't run your task like it specified in the doc:
gulp.task('default', ['jshint', 'sitespeedio']);
but then you need somehow to tell to gulp task to wait till sitespeedio finishes own job.
If you don't want to look at sources of gulp-sitespeedio and especially if you are newbie in Gulp it can be tricky.
I used Gulp-sitespeedio for profiling a web app. But i struck on the below error.
TypeError: /Users/vijay/node_modules/sitespeed.io/lib/plugins/html/templates/pages.pug:8
6| - p = pageInfo.data.pagexray ? pageInfo.data.pagexray.pageSummary : {}
7| - t = p.contentTypes || {javascript: {transferSize: ''}, css: {transferSize: ''}, image: {transferSize: ''}}
8| - display = options.urlsMetaData[url] ? options.urlsMetaData[url].alias : url
9| tr
10| td.url.pagesurl(data-title='URL')
11| a(href= pageInfo.path + 'index.html')= decodeURIComponent(display)
Cannot read property 'https://www.sitespeed.io' of undefined
6| - p = pageInfo.data.pagexray ? pageInfo.data.pagexray.pageSummary : {}
7| - t = p.contentTypes || {javascript: {transferSize: ''}, css: {transferSize: ''}, image: {transferSize: ''}}
8| - display = options.urlsMetaData[url] ? options.urlsMetaData[url].alias : url
9| tr
10| td.url.pagesurl(data-title='URL')
11| a(href= pageInfo.path + 'index.html')= decodeURIComponent(display)
Cannot read property 'https://www.sitespeed.io' of undefined
at Object.eval (eval at wrap (/Users/vijay/node_modules/pug-runtime/wrap.js:6:10), :144:31)
at Object.pug_interp [as rows] (eval at wrap (/Users/vijay/node_modules/pug-runtime/wrap.js:6:10), :183:4)
at eval (eval at wrap (/Users/vijay/node_modules/pug-runtime/wrap.js:6:10), :320:19)
at template (eval at wrap (/Users/vijay/node_modules/pug-runtime/wrap.js:6:10), :353:184)
at Object.renderTemplate (/Users/vijay/node_modules/sitespeed.io/lib/plugins/html/renderer.js:28:37)
at HTMLBuilder._renderSummaryPage (/Users/vijay/node_modules/sitespeed.io/lib/plugins/html/htmlBuilder.js:196:67)
at Object.keys.map (/Users/vijay/node_modules/sitespeed.io/lib/plugins/html/htmlBuilder.js:104:27)
at Array.map (native)
at HTMLBuilder.render (/Users/vijay/node_modules/sitespeed.io/lib/plugins/html/htmlBuilder.js:104:8)
at Object.close (/Users/vijay/node_modules/sitespeed.io/lib/plugins/html/index.js:26:29)
at Promise.resolve.filter.map (/Users/vijay/node_modules/sitespeed.io/lib/sitespeed.js:43:49)
at tryCatcher (/Users/vijay/node_modules/bluebird/js/release/util.js:16:23)
at MappingPromiseArray._promiseFulfilled (/Users/vijay/node_modules/bluebird/js/release/map.js:61:38)
at MappingPromiseArray.PromiseArray._iterate (/Users/vijay/node_modules/bluebird/js/release/promise_array.js:113:31)
at MappingPromiseArray.init (/Users/vijay/node_modules/bluebird/js/release/promise_array.js:77:10)
at MappingPromiseArray._asyncInit (/Users/vijay/node_modules/bluebird/js/release/map.js:30:10)
And the parameter used in the config file is,
({
urls: ['https://www.sitespeed.io'],
depth: 0,
browsertime: {
browser: 'chrome',
connectivity: 'cable',
iterations: 2,
}
})
}
I'm breaking my head for a week.
Could you help on resolving the above issue.
I'm currently getting the following exception:
Catched an uncaught exception:TypeError: Cannot read property 'har' of undefinedTypeError: Cannot read property 'har' of undefined
at GraphiteCollector._getMeta (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/graphite/graphiteCollector.js:84:15)
at GraphiteCollector.collect (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/graphite/graphiteCollector.js:70:22)
at Object.exports.task (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/postTasks/sendToGraphite.js:17:32)
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/analyzeOneSite.js:181:32
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:718:13
at async.forEachOf.async.eachOf (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:233:13)
at _parallel (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:717:9)
at Object.async.parallel (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:731:9)
at AnalyzeOneSite._runPostTasks (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/analyzeOneSite.js:260:9)
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/analyzeOneSite.js:59:12
at fn (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:746:34)
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:1213:16
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:166:37
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:706:43
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:167:37
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:1209:30
Here's my task config:
gulp.task('sitespeed', sitespeedio({
urls: ['http://www.sitespeed.io', 'http://www.sitespeed.io/faq/'],
browser: 'chrome',
connection: 'cable',
graphiteHost: 'localhost',
graphitePort: 2003,
graphiteNamespace: 'sitespeed'
}));
I'm using Node 4.2.6 and NPM 2.14.12
Here's the full process stack:
/usr/local/bin/node /usr/local/lib/node_modules/gulp/bin/gulp.js --color --gulpfile /Users/tom/Sites/FestiveLights/gulpfile.js sitespeed
[10:30:44] Using gulpfile ~/Sites/FestiveLights/gulpfile.js
[10:30:44] Starting 'sitespeed'...
[10:30:44] Analyze your site’s web performance
info: OS: 'darwin 15.2.0', Node.js: 'v4.2.6', sitespeed.io: '3.11.3', PhantomJS: '1.9.8', java: '1.6.0_65', browsertime: '0.12.2'
info: Will analyze 2 pages
info: Running YSlow for http://www.sitespeed.io [phantomjs]
info: Running YSlow for http://www.sitespeed.io/faq/ [phantomjs]
Starting proxy on port 2001, will wait at most 15000 ms
info: Done analyzing urls
Catched an uncaught exception:TypeError: Cannot read property 'har' of undefinedTypeError: Cannot read property 'har' of undefined
Stopping proxy
at GraphiteCollector._getMeta (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/graphite/graphiteCollector.js:84:15)
at GraphiteCollector.collect (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/graphite/graphiteCollector.js:70:22)
at Object.exports.task (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/postTasks/sendToGraphite.js:17:32)
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/analyzeOneSite.js:181:32
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:718:13
at async.forEachOf.async.eachOf (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:233:13)
at _parallel (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:717:9)
at Object.async.parallel (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:731:9)
at AnalyzeOneSite._runPostTasks (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/analyzeOneSite.js:260:9)
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/lib/analyzeOneSite.js:59:12
at fn (/Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:746:34)
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:1213:16
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:166:37
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:706:43
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:167:37
at /Users/tom/Sites/FestiveLights/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/async/lib/async.js:1209:30
Process finished with exit code 1
How can I use a new chrome driver?
I'm getting an error this setup. What am I missing?
gulp
/** sitespeedio: test size of project in browser **/
gulp.task('speedtest', function (done) {
sitespeedio({
urls: ['http://www.tcalions.com.php7-27.phx1-1.websitetestlink.com'],
browser: 'firefox',
depth: 0,
browsertime: {
connectivity: 'cable',
iterations: 3,
screenshot: false
}
})(done)
});
Errors:
Browsertime BrowserError: disconnected: unable to connect to renderer
ERROR: TypeError: Cannot read property 'getItems' of undefined
console output:
*[master][~/wip/tcalions/wp-content/themes/tcalions]$ gulp speedtest
[12:27:07] Using gulpfile ~/wip/tcalions/wp-content/themes/tcalions/gulpfile.js
[12:27:07] Starting 'speedtest'...
[12:27:07] Analyze your site’s web performance
[12:27:07] { urls: [ 'http://tcalions.dev' ] }
[2017-12-13 12:27:07] INFO: Versions OS: darwin 16.7.0 nodejs: v8.5.0 sitespeed.io: 5.4.0 browsertime: 1.5.2 coach: 0.34.1
[2017-12-13 12:27:07] INFO: Starting chrome for analysing http://tcalions.dev 3 time(s)
[2017-12-13 12:27:07] INFO: Testing url http://tcalions.dev run 1
[2017-12-13 12:27:08] ERROR: http://tcalions.dev generated the following error in Browsertime BrowserError: disconnected: unable to connect to renderer
(Session info: chrome=62.0.3202.94)
(Driver info: chromedriver=2.30.477690 (c53f4ad87510ee97b5c3425a14c0e79780cdf262),platform=Mac OS X 10.12.6 x86_64)
(Session info: chrome=62.0.3202.94)
(Driver info: chromedriver=2.30.477690 (c53f4ad87510ee97b5c3425a14c0e79780cdf262),platform=Mac OS X 10.12.6 x86_64)
at startBrowser.call.catch.tap.tap.catch.catch (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/browsertime/lib/core/seleniumRunner.js:82:15)
at tryCatcher (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/bluebird/js/release/promise.js:512:31)
at Promise._settlePromise (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/bluebird/js/release/promise.js:569:18)
at Promise._settlePromise0 (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/bluebird/js/release/promise.js:614:10)
at Promise._settlePromises (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/bluebird/js/release/promise.js:689:18)
at Async._drainQueue (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/bluebird/js/release/async.js:133:16)
at Async._drainQueues (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/bluebird/js/release/async.js:143:10)
at Immediate.Async.drainQueues (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/bluebird/js/release/async.js:17:14)
at runCallback (timers.js:781:20)
at tryOnImmediate (timers.js:743:5)
at processImmediate [as _immediateCallback] (timers.js:714:5)
[2017-12-13 12:27:08] ERROR: TypeError: Cannot read property 'getItems' of undefined
at Object.summarize (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/sitespeed.io/lib/plugins/assets/aggregator.js:101:49)
at Object.processMessage (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/sitespeed.io/lib/plugins/assets/index.js:34:36)
at queue.process (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/sitespeed.io/lib/support/queueHandler.js:155:57)
at drainItem (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/concurrent-queue/index.js:92:21)
at Immediate.drain (/Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/node_modules/concurrent-queue/index.js:73:84)
at runCallback (timers.js:781:20)
at tryOnImmediate (timers.js:743:5)
at processImmediate [as _immediateCallback] (timers.js:714:5)
[2017-12-13 12:27:08] INFO: Render HTML for 1 page(s)
[2017-12-13 12:27:09] INFO: HTML stored in /Users/chancesmith/wip/tcalions/wp-content/themes/tcalions/sitespeed-result/tcalions.dev/2017-12-13-12-27-07
[2017-12-13 12:27:09] INFO: Finished analysing http://tcalions.dev
Hey,
i would like to use [email protected] to test my website with webpagetest.
But I get an error on my console and I dont know why. May anybody help me to find my fault, please?
[20:16:26] Starting 'webpagetest:build'...
[20:16:26] Analyze your site’s web performance
info: OS: 'darwin 15.6.0', Node.js: 'v5.1.0', sitespeed.io: '3.5.0', PhantomJS: '1.9.8', java: '1.8.0_31', browsertime: '0.9.4'
info: Using configured web perf budget {"wpt":{"requests":60,"bytesIn":1000000,"SpeedIndex":1000}}
info: Will analyze 2 pages
info: Running WebPageTest http://www.sitespeed.io pollResults=10, timeout=800, firstViewOnly=false, runs=9, private=true, aftRenderingTime=true, location=Dulles:Firefox, connectivity=3G, video=true
info: Running WebPageTest http://www.sitespeed.io/faq/ pollResults=10, timeout=800, firstViewOnly=false, runs=9, private=true, aftRenderingTime=true, location=Dulles:Firefox, connectivity=3G, video=true
error: WebPageTest couldn't fetch info for url http://www.sitespeed.io{ [WPTAPIError: Moved Permanently] name: 'WPTAPIError', code: 301, message: 'Moved Permanently' }
error: Error running WebPageTest: { [WPTAPIError: Moved Permanently] name: 'WPTAPIError', code: 301, message: 'Moved Permanently' }
error: WebPageTest couldn't fetch info for url http://www.sitespeed.io/faq/{ [WPTAPIError: Moved Permanently] name: 'WPTAPIError', code: 301, message: 'Moved Permanently' }
error: Error running WebPageTest: { [WPTAPIError: Moved Permanently] name: 'WPTAPIError', code: 301, message: 'Moved Permanently' }
/Users/.../node_modules/sitespeed.io/lib/util/util.js:279
return pageData.webpagetest.wpt[0].response.data.testUrl;
^
TypeError: Cannot read property 'response' of undefined
at Object.module.exports.getURLFromPageData (/Users/.../node_modules/sitespeed.io/lib/util/util.js:279:43)
at Object.exports.processPage (/Users/.../node_modules/sitespeed.io/lib/collectors/assetsByTiming.js:25:21)
at /Users/.../node_modules/sitespeed.io/lib/collector.js:126:7
at Array.forEach (native)
at Collector.collectPageData (/Users/.../node_modules/sitespeed.io/lib/collector.js:125:19)
at processAnalysisResults (/Users/.../node_modules/sitespeed.io/lib/analyze/analyzer.js:171:14)
at /Users/.../node_modules/sitespeed.io/lib/analyze/analyzer.js:68:7
at /Users/.../node_modules/async/lib/async.js:254:17
at /Users/.../node_modules/async/lib/async.js:157:25
at /Users/.../node_modules/async/lib/async.js:251:21
at Object.queue.drain (/Users/.../node_modules/sitespeed.io/lib/analyze/webpagetest.js:63:11)
at next (/Users/.../node_modules/async/lib/async.js:804:31)
at /Users/.../node_modules/async/lib/async.js:32:16
at /Users/.../node_modules/sitespeed.io/lib/analyze/webpagetest.js:127:14
at WebPageTest.testCallback (/Users/.../node_modules/webpagetest/lib/webpagetest.js:346:14)
at callbackYield (/Users/.../node_modules/webpagetest/lib/webpagetest.js:138:14)
And here is my configuration. It is exact your example.
var gulp = require( "gulp" ),
sitespeedio = require( "gulp-sitespeedio" );
gulp.task( "webpagetest:build", sitespeedio( {
urls: ["http://www.sitespeed.io", "http://www.sitespeed.io/faq/"],
noYslow: true,
wptKey: "SECRET_KEY",
wptHost: "www.webpagetest.org",
no: 9,
wptConfig: {
location: "Dulles:Firefox",
connectivity: "3G",
timeout: 800
},
budget: {
wpt: {
requests: 60,
bytesIn: 1000000,
SpeedIndex: 1000
}
}
} ) );
node-version: v5.1.0
npm-version: v3.3.12
gulp-version: CLI v3.9.0 // LOCAL 3.9.1
Thanks for any help...
I ran into issues when trying to move to Node 4.x due to a dependency chain leading to gulp-sitespeedio. This issue does not exist in sitespeed.io at lastest (currently 3.11.1), but gulp-sitespeedio's current version for sitespeed.io is 3.5.0. Updating this dependency would allow for use of Node 4 and later.
For reference:
/Users/{me}/dev/{project}/node_modules/gulp-sitespeedio/node_modules/sitespeed.io/node_modules/browsertime/node_modules/selenium-webdriver/node_modules/ws/node_modules/utf-8-validate
> node-gyp rebuild
CXX(target) Release/obj.target/validation/src/validation.o
In file included from ../src/validation.cc:15:
../node_modules/nan/nan.h:261:25: error: redefinition of '_NanEnsureLocal'
NAN_INLINE v8::Local<T> _NanEnsureLocal(v8::Local<T> val) {
This is one of many similar errors I see when trying to use Node 4.x
I have created a gulp task as per the following:
gulp.task('sitespeedio', function() {
sitespeedio({
url: 'http://localhost/',
deepth: 5,
resultBaseDir: './sitespeedio/',
browser: 'chrome',
connection: 'cable',
no: 11,
headless: 'slimerjs',
showFailedOnly: false,
graphiteHost: 'localhost',
graphitePort: 2003,
graphiteNamespace: 'sitespeed',
budget: {
rules: {
default: 90
},
page: {
image: 10,
css: 1,
requests: 7,
pageWeight:300000,
jsWeight: 0
},
timings: {
speedIndex: 1000,
headerTime: 800,
logoTime: 500,
domContentLoadedTime: 900
}
}
})
});
And I have set up a graphite server using Docker using that port but when I run the task it just completes in a short amount of time with no results. Is there something I am doing incorrectly?
Fails to install. npm install gulp-sitespeedio --save-dev
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] install: node-gyp rebuild
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
i use gulp-sitespeedio to test our website,the application has a login page. If I provide the application's url, if a valid user is not logged in the login page will be displayed. So how do I test performance using gulp-sitespeedio? Is it possible to automate the login part?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.