Targeting placeholders such as the Top and Bottom zones. In earlier versions of SPFx, some pages only had the Top zone but missed the Bottom zone. Thats now been fixed and it seems that if the Top zone exists on a page type e. Site Contents page, document library or list page etc., the Bottom one will too I showed a relatively narrow bar above, but theres nothing to stop you making that top zone larger if you want to with CSS this image is zoomed out But of course, all this only applies to modern pages classic pages do NOT have these zones or support SPFx extensions in general Ill talk about the end to end process later, but to get straight to the code with some minor tweakssimplification to the suggested code in the documentation, mine looks like this And the CSS is implemented by adding an SCSS file in your extensions directory mine is named App. Customizer. module. Remember this is imported to the class for your customizer e. I60Apg0/VssJO5uPzAI/AAAAAAAAK-4/F_kd9ianBpc/s1600/add%2Bnew%2Bitem%2Bsharepoint%2B2013%2Bpowershell.png' alt='Update Sharepoint List Items Using Jquery Locally' title='Update Sharepoint List Items Using Jquery Locally' />App. Customizer. module. So, the key elements here are A class that derives from the Application. Base. Customizer class. Use of the this. context. Provider. try. Create. Content method to get a reference to the appropriate placeholder and its content and the fact that it gives you the DOM element to manipulate e. HTMLDeployment options global or site by site. In terms of what associates your customizer to the site, there are two ways of doing this in production Site by site in this approach, you add some declarative XML to your app packaging, and then ensure the app is installed from the App Catalog to each site where your extension should operate. Specifically, your customizer has a manifest file which contains its ID My. Customizer. manifest. Custom. Action element just like the old days. This has a new Client. Side. Component. Id attribute, and this must point to the ID of your customizer. Globalscripted in this approach, you set the skip. Feature. Deployment attribute to true in youre package solution. CSOM or REST to add a Custom. Action programmatically to each web as you need i. See https dev. When using this approach, the admin has the option of making the SPFx web partextension globally available when installing to the App Catalog. SPFx web parts will show up in every site, but as I say, for SPFx extensions you also need to take care of the programmatic associationregistration to each siteweb you require, using Custom. ActionClient. Side. Component. Id. See my post Manage tenant scoped SPFx extensions across your Share. Point sites for some Power. ShellC code to do this. But before packaging for production, theres a mode when you can devtest your customizer before worrying about packaging. This works by running a gulp serve locally and adding some querystring parameters to a modern page so that the manifest is loaded from localhost its a bit like the local SPFx workbench equivalent but for SPFx extensionscustomizers. But I dont need placeholders I just want to reference some Java. Script on every page In this case, the code is somewhat simpler. If you have an external JS file you want to reference in a quick and dirty way, you could do this by dynamically adding a script tag to the lt head element of the page. My testing shows it seems safe to do this in the on. Init method, but the on. Render method would be fine also in any case, its just the old fashioned method like this But considerIf the JS is hosted on another domain, you may need to enable CORS there depending on what your JS is doing If youre referencing a module script, you could do this in a cleaner way by referencing it as an external module in the externals section of your config. Add an external library to your Share. Point client side web part for more. Ive tested and this approach does work with an Application Customizer. You could also choose to bundle your script if that made sense, and ensure it was referenced in the on. Render method for your customizer. That should work too. Include another HTML file in a HTML filehtml. I myself didnt know this existed. The thing is, this requires the use of a web server and and HTTPRequest object. You cant actually load these locally and test them on your machine. What you can do though, is use polyfills provided on the html. With a little JS magic, you can do something like this var link document. Elementlink. ifimport in link. Run import code. link. Attributerel,import. Attributehref,import. Path. document. get. Elements. By. Tag. Namehead0. append. Childlink. Create a phantom element to append the import document text to. Selectorlinkrelimport. Text document. create. Elementdiv. doc. Text. HTML link. Childdoc. Text. clone. Nodetrue. Imports arent supported, so call polyfill. Polyfillimport. Path. This will make the link Can change to be the wanted link element if already set, set the import unless you already have it, and then append it. It will then from there take that and parse the file in HTML, and then append it to the desired element under a div. This can all be changed to fit your needs from the appending element to the link you are using. I hope this helped, it may irrelevant now if newer, faster ways have come out without using libraries and frameworks such as j. Query or W3. js. UPDATE This will throw an error saying that the local import has been blocked by CORS policy. Might need access to the deep web to be able to use this because of the properties of the deep web. Meaning no practical use.