SlideShare a Scribd company logo
Pitfalls when developing with the
SharePoint Framework (SPFx)
Chris O’Brien (MVP)
Independent/Content and Code, UK
Add
Speaker
Photo here
Notes on this presentation
If you have previously seen this presentation/slide deck
before, note the following updates:
Content Slides
Pitfalls around Office UI Fabric 27-30
Pitfalls around calling the Microsoft
Graph or custom APIs secured with Azure
Active Directory
31-35
Use of SPFx component bundles 40-42
Chris OBrien - Pitfalls when developing with the SharePoint Framework (SPFx)
Fundamentals – how it all works
Packages installed/updated using npm
• .NET analogy = NuGet
Dependent JS libraries stored in node_modules
• .NET analogy = the BIN directory
• Gets bundled/deployed with your app
Package.json records your top-level dependencies
• .NET analogy = packages.config
• Allows other devs to build app from source control
• N.B. Each dependency may have IT’S OWN dependencies and package.json
COB App
- node_modules
- jQuery
- node_modules
- cache-swap
- node_modules
- React
- node_modules
……
Simplified node_modules hierarchy
Fundamentals - how to add a library
Use npm install command e.g:
npm install jquery
Installs library to your app (in node_modules)
Important parameter:
--save OR --save-exact
Usually add TypeScript typings (for auto-complete)
npm install @types/jquery -–save
Understanding package.json
dependencies node
• Lists all 3rd party libraries needed to
run
devDependencies node
• Lists all 3rd party libraries needed to
develop/build
Semantic versioning (semver)
Example Known as Meaning
^1.2.1 Caret dependency Greater than or equal to 1.2.1, but less than 2.0.0
~1.2.1 Tilde dependency Greater than or equal to 1.2.1, but less than 1.3.0
1.2.1 Exact dependency 1.2.1 only
Fundamentals
3 part version number – e.g. 1.0.0
Major.Minor.Patch
Major = breaking change/substantial differences
Minor = non-breaking e.g. new methods
Patch = no interface changes e.g. optimisations,
documentation
Versioning/dependency pitfalls
Using caret
dependencies (the
default)
Not specifying –
save on npm install
Dev:
Not locking
dependencies
down
Shipping:
Will change in
npm 5!
--save
(until npm 5)
Dependencies and shipping
The problem – “dependency float”
• Your app has many JS dependencies (the node_modules tree)
• node_modules should not be checked-in
• Different version somewhere in tree -> Broken app
The solution – npm shrinkwrap
• Generates npm-shrinkwrap.json file
Critical to getting a “100% reproducible build”
• Locks down dependencies – for entire node_modules tree
npm shrinkwrap
Tip - check-in npm-shrinkwrap.json
for each shipped release
• Allows exact build to be recreated
• Allows other devs to build exact app from
source control
Better than save-exact – deals with
full dependency tree
• save-exact only deals with top-level
dependencies
Chris OBrien - Pitfalls when developing with the SharePoint Framework (SPFx)
Remember the rule:
= OK
^ = Not OK
Recommendations – versioning etc.
Pitfall How avoided More reading
Avoid dependency issues
in dev
Ensure devs *save* packages properly – use npm
install --save/--save-exact.
Consider custom .npmrc file across team
http://cob-
sp.com/2fOtApJ
Avoid dependency issues
when shipping
Use npm shrinkwrap for each release https://docs.npmjs.
com/cli/shrinkwrap
Chris OBrien - Pitfalls when developing with the SharePoint Framework (SPFx)
Code re-use pitfall
Copy/pasting JS code into each app,
because not clear how to re-use properly
Re-using existing JS code
Create a module for your code
• Expose each method with exports statement:
module.exports = {
CheckRealValue: COB.CORE.Utilities.CheckRealValue,
StringIsEmpty: COB.CORE.Utilities.StringIsEmpty
}
Create package.json file
• Specify entry point (file)
Re-using existing JS code
Access module with ‘require’
• var cobUtil = require('cob-utility')
• cobUtil.StringIsEmpty("foo");
Chris OBrien - Pitfalls when developing with the SharePoint Framework (SPFx)
So, now you have a module.
How to include/reference that?
Some popular options
Use npm LOCAL packages
• Install from file path (COPY) or use NPM LINK
Use node_modules higher up filesystem
• Take advantage of “recurse upwards” approach of npm- See http://cob-
sp.com/2eXDJOI
Use private package hosting
• npm private packages - $7 pm/user
• VSTO private hosting - $4 pm/user
Also consider:
https://www.visualstudio.co
m/en-
us/docs/package/install
Recommendations – code re-use
Pitfall How More reading
Copy/pasting JS code into
each project
Create modules for existing code
Consider module strategy:
• npm install [filepath]
• npm link (for “parallel dev” of client and utility
code)
• Use of npm private packages etc.
http://nicksellen.co.
uk/2015/04/17/ho
w-to-manage-
private-npm-
modules.html
http://stackoverflo
w.com/questions/2
1233108/cross-
project-references-
between-two-
projects
Chris OBrien - Pitfalls when developing with the SharePoint Framework (SPFx)
SPFX coding pitfalls
Dealing with async
code/ promises
Calling the
Microsoft Graph
(permutations)
Calling secure APIs
(AAD)Office UI Fabric
Adding a library
TypeScript issues
Pitfall – Office UI Fabric issues
Problem:
You want to use Fabric but are confused..
Office UI Fabric
• Office UI Fabric Core a.k.a. Fabric Core - this is a set of
core styles, typography, a responsive grid, animations,
icons, and other fundamental building blocks of the
overall design language.
• Office UI Fabric React a.k.a. Fabric React - this package
contains a set of React components built on top of the
Fabric design language.
Pitfall – Office UI Fabric issues
Problem:
You want to use Fabric but are confused..
Solution:
• To use Fabric Core easily, use SPFx v1.3.4
or later (
• Using React? Can use Fabric React
components – use individual static links
(for bundle size)
Key npm packages:
• office-ui-fabric-
react
• @microsoft/sp-
office-ui-fabric-
core (new)
Correct use of Fabric React (bundling
approach)
WARNING – React styles are bundled with EACH web part in this
approach. Mitigate with SPFx component bundles if you need to (e.g.
expecting many of your web parts on page).
See http://cob-sp.com/2hPVmUc
Pitfall – calling the Graph/custom APIs
Problem:
You need to call the Graph or a custom API
from SPFx (i.e. AAD-secured)
Solution:
• Understand today’s options:
• GraphHttpClient (limited scenarios!)
• AAD app + adal.js
• AAD app + SPO auth cookie/IFrame approach
• Understand a future option:
• AAD app + tell SPFx to trust it
Graph/custom API permutations
- GraphHttpClient
- or more likely, use of adal.js
Calling the Graph from
client-side
- adal.js
- SPO auth cookie/IFrame
Calling custom API (AAD)
from client-side
•- adal.js from client (SPO auth cookie approach gives token
which cannot be used with Graph)
- adal.NET within custom API
OR
- New Azure Functions bindings (preview – can’t get to work!)
- Use of both “on behalf of user” and “app-only”
Calling custom API
(AAD) from client-side
which calls the Graph
Reference:
Connect to API
secured with AAD -
http://cob-
sp.com/SPFx-AAD
Cheat sheet - custom APIs/Azure Functions
with AAD
ADAL.js
• CORS – define rule for each
calling page
• Code - Ensure asking for
token for your resource
(AAD client ID)
SPO auth cookie approach
• Empty CORS rules
• Code:
• Pass “credentials” :
“include” header, and sure
API/Function can receive..
• IFrame onto Function URL
Reference:
Connect to API
secured with AAD -
http://cob-
sp.com/SPFx-AAD
CONSIDER:
• Each web part/extension on
page must sign-in
• AAD reply URL needed for
each page with WP (max 10!)
CONSIDER:
• Sign-in applies to entire
page/session
• Cannot access user
identity (app-only)
Future option – Graph/customAPIs
Graph - Specify additional permission
scopes for GraphHttpClient
e.g. I’m OK with all SPFx web parts having access to
more than Groups and Reports
Your APIs/Azure Functions
Specify additional custom APIs for same token
Benefit – no need for sign-in button in your
WP/extension
Dev preview late 2017?
{
"WebApiPermissionRequest": {
"ResourceId": “GUID goes here",
"Scope": “GUID goes here",
}
"WebApiPermissionRequest": {
"ResourceId": “GUID goes here",
"Scope": “GUID goes here",
}
"WebApiPermissionRequest": {
"ResourceId": “GUID goes here",
"Scope": “GUID goes here",
}
Recommendations – coding
Pitfall How avoided More reading
Office UI Fabric
issues
Get familiar with:
• Fabric Core vs. Fabric React components
• SPFx 1.3.4/sp-office-ui-fabric-core package
• Using mixins in your SCSS
http://cob-sp.com/SPFx-
OUIF
Graph/custom API
issues
Get familiar with:
• Register AAD apps + adal.js
• SPO auth cookie approach
• Future SPFx option
http://cob-sp.com/SPFx-AAD
Async code issues Get familiar with:
• Promises
http://cob-sp.com/SPFX-
Promises
Security issues Avoid SPFX if sensitive data sent to client (page
or JS) - use Add-in parts/IFrames if needed
http://cob-sp.com/2ez9JNX
Chris OBrien - Pitfalls when developing with the SharePoint Framework (SPFx)
Pitfalls - deployment
Accidentally
bundling external
libraries/frameworks
Accidentally shipping
a debug build
Losing track of
remote JS code
Bundling considerations
Librariesare includedin your bundle BY DEFAULT
Update config.json if (e.g.) jQuery should be referenced from CDN
One bundleper web part BY DEFAULT - across your site
10 web parts = 10 different copies of jQuery being downloaded
GUID in bundleURL is regeneratedon each build
This is the versioning/cache-busting mechanism
TIP – delete unused JS files from CDN to keep things tidy
Chris OBrien - Pitfalls when developing with the SharePoint Framework (SPFx)
Bundling – rule #1
“Externalise” where possible (CDN):
Bundling – rule #2
Ensure any libs you ARE bundling are consolidated (with
SPFx component bundles):
WP1 WP2
cob-bothWebParts.js
Recommendations – deployment
Pitfall How avoided More reading
Accidental
bundling
Ensure libs loaded externally where possible
Update “externals” section of config.json
Waldek - http://cob-
sp.com/2frVMR3
Duplication of code
in bundle
Use SPFx component bundles Elio - http://cob-
sp.com/SPFx-
CompBundle
Losing track of
remote JS code
• Proactively track CDN locations (e.g. Excel?)
• Use SPCAF to help identify
www.spcaf.com
Key take-aways
It’s a new world, with different pitfalls!
Recommendations:
Get familiar with NPM especially
Plan for code re-use (e.g. modules) if appropriate
Practice “production” deployments
Dependencies/versioning e.g. dependency float
Coding e.g. OUIF, calling the Graph or custom APIs
Deployment e.g. accidental bundling, duplication in bundle
Thank you!! 
Any questions?
www.sharepointnutsandbolts.com
Bundling – how it goes wrong
Perhaps a 2nd web part is added..
Some libraries are installed using
npm (e.g. Angular)..
Bundling – how it goes wrong
gulp bundle --ship
gulp deploy-azure-storage
gulp package-solution --ship
SPFx deployment process:
Bundling – how it goes wrong
App package added to App Catalog:
Bundling – done wrong

More Related Content

What's hot (20)

PPTX
TypeScript and SharePoint Framework
Bob German
 
PDF
SPUnite17 Timer Jobs Event Handlers
NCCOMMS
 
PPTX
COB ESPC18 - Rich PowerApps with offline support
Chris O'Brien
 
PPTX
SharePoint Development with the SharePoint Framework
JoAnna Cheshire
 
PPTX
ECS19 Bert Jansen - Modernizing your existing sites
European Collaboration Summit
 
PPTX
SharePoint Framework - Developer Preview
Sean McLellan
 
PPTX
Modern SharePoint Development using Visual Studio Code
Jared Matfess
 
PDF
Create SASSy web parts in SPFx
Stefan Bauer
 
PDF
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
NCCOMMS
 
PPTX
Application innovation & Developer Productivity
Kushan Lahiru Perera
 
PPTX
Azure Web Jobs
BizTalk360
 
PDF
[Struyf] Automate Your Tasks With Azure Functions
European Collaboration Summit
 
PDF
O365Con18 - Site Templates, Site Life Cycle Management and Modern SharePoint ...
NCCOMMS
 
PPTX
Introduction to ASP.NET
Peter Gfader
 
PPTX
Activate bots within SharePoint Framework
Kushan Lahiru Perera
 
PPTX
SharePoint PowerShell for the Admin and Developer - A Venn Diagram Experience
Ricardo Wilkins
 
PDF
SPUnite17 SPFx Extensions
NCCOMMS
 
PDF
SPUnite17 Introduction to the Office Dev PnP Core Libraries
NCCOMMS
 
PDF
O365Con18 - Implementing Automated UI Testing for SharePoint Solutions - Elio...
NCCOMMS
 
PPTX
COB - PowerApps - the good, the bad and the ugly - early 2018
Chris O'Brien
 
TypeScript and SharePoint Framework
Bob German
 
SPUnite17 Timer Jobs Event Handlers
NCCOMMS
 
COB ESPC18 - Rich PowerApps with offline support
Chris O'Brien
 
SharePoint Development with the SharePoint Framework
JoAnna Cheshire
 
ECS19 Bert Jansen - Modernizing your existing sites
European Collaboration Summit
 
SharePoint Framework - Developer Preview
Sean McLellan
 
Modern SharePoint Development using Visual Studio Code
Jared Matfess
 
Create SASSy web parts in SPFx
Stefan Bauer
 
O365Con18 - Automate your Tasks through Azure Functions - Elio Struyf
NCCOMMS
 
Application innovation & Developer Productivity
Kushan Lahiru Perera
 
Azure Web Jobs
BizTalk360
 
[Struyf] Automate Your Tasks With Azure Functions
European Collaboration Summit
 
O365Con18 - Site Templates, Site Life Cycle Management and Modern SharePoint ...
NCCOMMS
 
Introduction to ASP.NET
Peter Gfader
 
Activate bots within SharePoint Framework
Kushan Lahiru Perera
 
SharePoint PowerShell for the Admin and Developer - A Venn Diagram Experience
Ricardo Wilkins
 
SPUnite17 SPFx Extensions
NCCOMMS
 
SPUnite17 Introduction to the Office Dev PnP Core Libraries
NCCOMMS
 
O365Con18 - Implementing Automated UI Testing for SharePoint Solutions - Elio...
NCCOMMS
 
COB - PowerApps - the good, the bad and the ugly - early 2018
Chris O'Brien
 

Similar to Chris OBrien - Pitfalls when developing with the SharePoint Framework (SPFx) (20)

PPTX
Azure DevOps for JavaScript Developers
Sarah Dutkiewicz
 
PDF
Multi modularized project setup with gulp, typescript and angular.js
David Amend
 
PDF
How to Implement Micro Frontend Architecture using Angular Framework
RapidValue
 
PPTX
Docker - Demo on PHP Application deployment
Arun prasath
 
PPTX
Alfresco Development Framework Basic
Mario Romano
 
PPT
XPages -Beyond the Basics
Ulrich Krause
 
PPTX
Docker based Architecture by Denys Serdiuk
Lohika_Odessa_TechTalks
 
PPTX
Short-Training asp.net vNext
Betclic Everest Group Tech Team
 
PDF
Scaleable PHP Applications in Kubernetes
Robert Lemke
 
PPTX
Fluo CICD OpenStack Summit
Miguel Zuniga
 
PPT
Extension Library - Viagra for XPages
Ulrich Krause
 
PDF
Simplified DevOps Bliss -with OpenAI API
VictorSzoltysek
 
PPTX
20171122 aws usergrp_coretech-spn-cicd-aws-v01
Scott Miao
 
PPTX
Tutorial 1: Your First Science App - Araport Developer Workshop
Vivek Krishnakumar
 
PDF
Priming Your Teams For Microservice Deployment to the Cloud
Matt Callanan
 
PPTX
Getting started with CFEngine - Webinar
CFEngine
 
PPTX
Building an Ionic hybrid mobile app with TypeScript
Serge van den Oever
 
PDF
Cluster-as-code. The Many Ways towards Kubernetes
QAware GmbH
 
PPTX
Using and extending Alfresco Content Application
Denys Vuika
 
PPTX
Aleksandr Kutsan "Managing Dependencies in C++"
LogeekNightUkraine
 
Azure DevOps for JavaScript Developers
Sarah Dutkiewicz
 
Multi modularized project setup with gulp, typescript and angular.js
David Amend
 
How to Implement Micro Frontend Architecture using Angular Framework
RapidValue
 
Docker - Demo on PHP Application deployment
Arun prasath
 
Alfresco Development Framework Basic
Mario Romano
 
XPages -Beyond the Basics
Ulrich Krause
 
Docker based Architecture by Denys Serdiuk
Lohika_Odessa_TechTalks
 
Short-Training asp.net vNext
Betclic Everest Group Tech Team
 
Scaleable PHP Applications in Kubernetes
Robert Lemke
 
Fluo CICD OpenStack Summit
Miguel Zuniga
 
Extension Library - Viagra for XPages
Ulrich Krause
 
Simplified DevOps Bliss -with OpenAI API
VictorSzoltysek
 
20171122 aws usergrp_coretech-spn-cicd-aws-v01
Scott Miao
 
Tutorial 1: Your First Science App - Araport Developer Workshop
Vivek Krishnakumar
 
Priming Your Teams For Microservice Deployment to the Cloud
Matt Callanan
 
Getting started with CFEngine - Webinar
CFEngine
 
Building an Ionic hybrid mobile app with TypeScript
Serge van den Oever
 
Cluster-as-code. The Many Ways towards Kubernetes
QAware GmbH
 
Using and extending Alfresco Content Application
Denys Vuika
 
Aleksandr Kutsan "Managing Dependencies in C++"
LogeekNightUkraine
 
Ad

More from Chris O'Brien (18)

PPTX
Chris O'Brien - Building AI into Power Platform solutions
Chris O'Brien
 
PPTX
Chris OBrien - Azure DevOps for managing work
Chris O'Brien
 
PPTX
Chris O'Brien - Ignite 2019 announcements and selected roadmaps
Chris O'Brien
 
PPTX
Chris O'Brien - Intro to Power BI for Office 365 devs (March 2017)
Chris O'Brien
 
PPTX
Chris O'Brien - Introduction to the SharePoint Framework for developers
Chris O'Brien
 
PPTX
Do's and don'ts for Office 365 development
Chris O'Brien
 
PPTX
Chris O'Brien - Customizing the SharePoint/Office 365 UI with JavaScript (ESP...
Chris O'Brien
 
PPTX
Deep dive into SharePoint 2013 hosted apps - Chris OBrien
Chris O'Brien
 
PPTX
Customizing the SharePoint 2013 user interface with JavaScript - Chris OBrien
Chris O'Brien
 
PPTX
SP2013 for Developers - Chris O'Brien
Chris O'Brien
 
PPTX
Getting to grips with SharePoint 2013 apps - Chris O'Brien
Chris O'Brien
 
PPTX
SharePoint Ribbon Deep Dive
Chris O'Brien
 
PPTX
Automated Builds And UI Testing in SharePoint 2010 Development
Chris O'Brien
 
PPTX
Optimizing SharePoint 2010 Internet Sites
Chris O'Brien
 
PPTX
Managing the SharePoint 2010 Application Lifecycle - Part 2
Chris O'Brien
 
PPTX
Managing the SharePoint 2010 Application Lifecycle - Part 1
Chris O'Brien
 
PPT
SharePoint workflow deep-dive
Chris O'Brien
 
PPT
SharePoint Web Content Management - Lessons Learnt/top 5 tips
Chris O'Brien
 
Chris O'Brien - Building AI into Power Platform solutions
Chris O'Brien
 
Chris OBrien - Azure DevOps for managing work
Chris O'Brien
 
Chris O'Brien - Ignite 2019 announcements and selected roadmaps
Chris O'Brien
 
Chris O'Brien - Intro to Power BI for Office 365 devs (March 2017)
Chris O'Brien
 
Chris O'Brien - Introduction to the SharePoint Framework for developers
Chris O'Brien
 
Do's and don'ts for Office 365 development
Chris O'Brien
 
Chris O'Brien - Customizing the SharePoint/Office 365 UI with JavaScript (ESP...
Chris O'Brien
 
Deep dive into SharePoint 2013 hosted apps - Chris OBrien
Chris O'Brien
 
Customizing the SharePoint 2013 user interface with JavaScript - Chris OBrien
Chris O'Brien
 
SP2013 for Developers - Chris O'Brien
Chris O'Brien
 
Getting to grips with SharePoint 2013 apps - Chris O'Brien
Chris O'Brien
 
SharePoint Ribbon Deep Dive
Chris O'Brien
 
Automated Builds And UI Testing in SharePoint 2010 Development
Chris O'Brien
 
Optimizing SharePoint 2010 Internet Sites
Chris O'Brien
 
Managing the SharePoint 2010 Application Lifecycle - Part 2
Chris O'Brien
 
Managing the SharePoint 2010 Application Lifecycle - Part 1
Chris O'Brien
 
SharePoint workflow deep-dive
Chris O'Brien
 
SharePoint Web Content Management - Lessons Learnt/top 5 tips
Chris O'Brien
 
Ad

Recently uploaded (20)

PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PDF
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit Team
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 

Chris OBrien - Pitfalls when developing with the SharePoint Framework (SPFx)

  • 1. Pitfalls when developing with the SharePoint Framework (SPFx) Chris O’Brien (MVP) Independent/Content and Code, UK Add Speaker Photo here
  • 2. Notes on this presentation If you have previously seen this presentation/slide deck before, note the following updates: Content Slides Pitfalls around Office UI Fabric 27-30 Pitfalls around calling the Microsoft Graph or custom APIs secured with Azure Active Directory 31-35 Use of SPFx component bundles 40-42
  • 4. Fundamentals – how it all works Packages installed/updated using npm • .NET analogy = NuGet Dependent JS libraries stored in node_modules • .NET analogy = the BIN directory • Gets bundled/deployed with your app Package.json records your top-level dependencies • .NET analogy = packages.config • Allows other devs to build app from source control • N.B. Each dependency may have IT’S OWN dependencies and package.json
  • 5. COB App - node_modules - jQuery - node_modules - cache-swap - node_modules - React - node_modules …… Simplified node_modules hierarchy
  • 6. Fundamentals - how to add a library Use npm install command e.g: npm install jquery Installs library to your app (in node_modules) Important parameter: --save OR --save-exact Usually add TypeScript typings (for auto-complete) npm install @types/jquery -–save
  • 7. Understanding package.json dependencies node • Lists all 3rd party libraries needed to run devDependencies node • Lists all 3rd party libraries needed to develop/build
  • 8. Semantic versioning (semver) Example Known as Meaning ^1.2.1 Caret dependency Greater than or equal to 1.2.1, but less than 2.0.0 ~1.2.1 Tilde dependency Greater than or equal to 1.2.1, but less than 1.3.0 1.2.1 Exact dependency 1.2.1 only Fundamentals 3 part version number – e.g. 1.0.0 Major.Minor.Patch Major = breaking change/substantial differences Minor = non-breaking e.g. new methods Patch = no interface changes e.g. optimisations, documentation
  • 9. Versioning/dependency pitfalls Using caret dependencies (the default) Not specifying – save on npm install Dev: Not locking dependencies down Shipping: Will change in npm 5!
  • 11. Dependencies and shipping The problem – “dependency float” • Your app has many JS dependencies (the node_modules tree) • node_modules should not be checked-in • Different version somewhere in tree -> Broken app The solution – npm shrinkwrap • Generates npm-shrinkwrap.json file Critical to getting a “100% reproducible build” • Locks down dependencies – for entire node_modules tree
  • 12. npm shrinkwrap Tip - check-in npm-shrinkwrap.json for each shipped release • Allows exact build to be recreated • Allows other devs to build exact app from source control Better than save-exact – deals with full dependency tree • save-exact only deals with top-level dependencies
  • 14. Remember the rule: = OK ^ = Not OK
  • 15. Recommendations – versioning etc. Pitfall How avoided More reading Avoid dependency issues in dev Ensure devs *save* packages properly – use npm install --save/--save-exact. Consider custom .npmrc file across team http://cob- sp.com/2fOtApJ Avoid dependency issues when shipping Use npm shrinkwrap for each release https://docs.npmjs. com/cli/shrinkwrap
  • 17. Code re-use pitfall Copy/pasting JS code into each app, because not clear how to re-use properly
  • 18. Re-using existing JS code Create a module for your code • Expose each method with exports statement: module.exports = { CheckRealValue: COB.CORE.Utilities.CheckRealValue, StringIsEmpty: COB.CORE.Utilities.StringIsEmpty } Create package.json file • Specify entry point (file)
  • 19. Re-using existing JS code Access module with ‘require’ • var cobUtil = require('cob-utility') • cobUtil.StringIsEmpty("foo");
  • 21. So, now you have a module. How to include/reference that?
  • 22. Some popular options Use npm LOCAL packages • Install from file path (COPY) or use NPM LINK Use node_modules higher up filesystem • Take advantage of “recurse upwards” approach of npm- See http://cob- sp.com/2eXDJOI Use private package hosting • npm private packages - $7 pm/user • VSTO private hosting - $4 pm/user Also consider: https://www.visualstudio.co m/en- us/docs/package/install
  • 23. Recommendations – code re-use Pitfall How More reading Copy/pasting JS code into each project Create modules for existing code Consider module strategy: • npm install [filepath] • npm link (for “parallel dev” of client and utility code) • Use of npm private packages etc. http://nicksellen.co. uk/2015/04/17/ho w-to-manage- private-npm- modules.html http://stackoverflo w.com/questions/2 1233108/cross- project-references- between-two- projects
  • 25. SPFX coding pitfalls Dealing with async code/ promises Calling the Microsoft Graph (permutations) Calling secure APIs (AAD)Office UI Fabric Adding a library TypeScript issues
  • 26. Pitfall – Office UI Fabric issues Problem: You want to use Fabric but are confused..
  • 27. Office UI Fabric • Office UI Fabric Core a.k.a. Fabric Core - this is a set of core styles, typography, a responsive grid, animations, icons, and other fundamental building blocks of the overall design language. • Office UI Fabric React a.k.a. Fabric React - this package contains a set of React components built on top of the Fabric design language.
  • 28. Pitfall – Office UI Fabric issues Problem: You want to use Fabric but are confused.. Solution: • To use Fabric Core easily, use SPFx v1.3.4 or later ( • Using React? Can use Fabric React components – use individual static links (for bundle size) Key npm packages: • office-ui-fabric- react • @microsoft/sp- office-ui-fabric- core (new)
  • 29. Correct use of Fabric React (bundling approach) WARNING – React styles are bundled with EACH web part in this approach. Mitigate with SPFx component bundles if you need to (e.g. expecting many of your web parts on page). See http://cob-sp.com/2hPVmUc
  • 30. Pitfall – calling the Graph/custom APIs Problem: You need to call the Graph or a custom API from SPFx (i.e. AAD-secured) Solution: • Understand today’s options: • GraphHttpClient (limited scenarios!) • AAD app + adal.js • AAD app + SPO auth cookie/IFrame approach • Understand a future option: • AAD app + tell SPFx to trust it
  • 31. Graph/custom API permutations - GraphHttpClient - or more likely, use of adal.js Calling the Graph from client-side - adal.js - SPO auth cookie/IFrame Calling custom API (AAD) from client-side •- adal.js from client (SPO auth cookie approach gives token which cannot be used with Graph) - adal.NET within custom API OR - New Azure Functions bindings (preview – can’t get to work!) - Use of both “on behalf of user” and “app-only” Calling custom API (AAD) from client-side which calls the Graph Reference: Connect to API secured with AAD - http://cob- sp.com/SPFx-AAD
  • 32. Cheat sheet - custom APIs/Azure Functions with AAD ADAL.js • CORS – define rule for each calling page • Code - Ensure asking for token for your resource (AAD client ID) SPO auth cookie approach • Empty CORS rules • Code: • Pass “credentials” : “include” header, and sure API/Function can receive.. • IFrame onto Function URL Reference: Connect to API secured with AAD - http://cob- sp.com/SPFx-AAD CONSIDER: • Each web part/extension on page must sign-in • AAD reply URL needed for each page with WP (max 10!) CONSIDER: • Sign-in applies to entire page/session • Cannot access user identity (app-only)
  • 33. Future option – Graph/customAPIs Graph - Specify additional permission scopes for GraphHttpClient e.g. I’m OK with all SPFx web parts having access to more than Groups and Reports Your APIs/Azure Functions Specify additional custom APIs for same token Benefit – no need for sign-in button in your WP/extension Dev preview late 2017? { "WebApiPermissionRequest": { "ResourceId": “GUID goes here", "Scope": “GUID goes here", } "WebApiPermissionRequest": { "ResourceId": “GUID goes here", "Scope": “GUID goes here", } "WebApiPermissionRequest": { "ResourceId": “GUID goes here", "Scope": “GUID goes here", }
  • 34. Recommendations – coding Pitfall How avoided More reading Office UI Fabric issues Get familiar with: • Fabric Core vs. Fabric React components • SPFx 1.3.4/sp-office-ui-fabric-core package • Using mixins in your SCSS http://cob-sp.com/SPFx- OUIF Graph/custom API issues Get familiar with: • Register AAD apps + adal.js • SPO auth cookie approach • Future SPFx option http://cob-sp.com/SPFx-AAD Async code issues Get familiar with: • Promises http://cob-sp.com/SPFX- Promises Security issues Avoid SPFX if sensitive data sent to client (page or JS) - use Add-in parts/IFrames if needed http://cob-sp.com/2ez9JNX
  • 36. Pitfalls - deployment Accidentally bundling external libraries/frameworks Accidentally shipping a debug build Losing track of remote JS code
  • 37. Bundling considerations Librariesare includedin your bundle BY DEFAULT Update config.json if (e.g.) jQuery should be referenced from CDN One bundleper web part BY DEFAULT - across your site 10 web parts = 10 different copies of jQuery being downloaded GUID in bundleURL is regeneratedon each build This is the versioning/cache-busting mechanism TIP – delete unused JS files from CDN to keep things tidy
  • 39. Bundling – rule #1 “Externalise” where possible (CDN):
  • 40. Bundling – rule #2 Ensure any libs you ARE bundling are consolidated (with SPFx component bundles): WP1 WP2 cob-bothWebParts.js
  • 41. Recommendations – deployment Pitfall How avoided More reading Accidental bundling Ensure libs loaded externally where possible Update “externals” section of config.json Waldek - http://cob- sp.com/2frVMR3 Duplication of code in bundle Use SPFx component bundles Elio - http://cob- sp.com/SPFx- CompBundle Losing track of remote JS code • Proactively track CDN locations (e.g. Excel?) • Use SPCAF to help identify www.spcaf.com
  • 42. Key take-aways It’s a new world, with different pitfalls! Recommendations: Get familiar with NPM especially Plan for code re-use (e.g. modules) if appropriate Practice “production” deployments Dependencies/versioning e.g. dependency float Coding e.g. OUIF, calling the Graph or custom APIs Deployment e.g. accidental bundling, duplication in bundle
  • 43. Thank you!!  Any questions? www.sharepointnutsandbolts.com
  • 44. Bundling – how it goes wrong Perhaps a 2nd web part is added.. Some libraries are installed using npm (e.g. Angular)..
  • 45. Bundling – how it goes wrong gulp bundle --ship gulp deploy-azure-storage gulp package-solution --ship SPFx deployment process:
  • 46. Bundling – how it goes wrong App package added to App Catalog: