1"use strict";(self.webpackChunkionic_docs=self.webpackChunkionic_docs||[]).push([["15714"],{56279(e,A,n){n.r(A),n.d(A,{metadata:()=>o,default:()=>c,frontMatter:()=>t,contentTitle:()=>l,toc:()=>d,assets:()=>r});var o=JSON.parse('{"id":"developing/tips","title":"Development Tips","description":"App Development Tips: How to Resolve Permission Errors and Issues","source":"@site/versioned_docs/version-v8/developing/tips.md","sourceDirName":"developing","slug":"/developing/tips","permalink":"/docs/v8/developing/tips","draft":false,"unlisted":false,"editUrl":"https://github.com/ionic-team/ionic-docs/edit/main/versioned_docs/version-v8/developing/tips.md","tags":[],"version":"v8","frontMatter":{"title":"Development Tips"},"sidebar":"docs","previous":{"title":"Developing for Android","permalink":"/docs/v8/developing/android"},"next":{"title":"Hardware Back Button","permalink":"/docs/v8/developing/hardware-back-button"}}'),i=n(74848),s=n(28453);let t={title:"Development Tips"},l,r={},d=[{value:"Resolving Permission Errors",id:"resolving-permission-errors",level:2},{value:"Option 1",id:"option-1",level:3},{value:"Option 2",id:"option-2",level:3},{value:"Updating Dependencies",id:"updating-dependencies",level:2},{value:"Code Editors",id:"code-editors",level:2},{value:"Using a Debugger",id:"using-a-debugger",level:2},{value:"Changing Mode",id:"changing-mode",level:2},{value:"Using the iOS Simulator",id:"using-the-ios-simulator",level:2},{value:"Using the Genymotion Android Emulator",id:"using-the-genymotion-android-emulator",level:2}];function a(e){let A={a:"a",admonition:"admonition",code:"code",em:"em",h2:"h2",h3:"h3",img:"img",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,s.R)(),...e.components},{Head:o}=A;return o||function(e,A){throw Error("Expected "+(A?"component":"object")+" `"+e+"` to be defined: you likely forgot to import, pass, or provide it.")}("Head",!0),(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(o,{children:[(0,i.jsx)("title",{children:"App Development Tips: How to Resolve Permission Errors and Issues"}),(0,i.jsx)("meta",{name:"description",content:"If errors occur, npm may need to be set up to operate without elevated permissions. Read our Ionic app Development Tips for more on resolving permission issues."})]}),"\n",(0,i.jsx)(A.h2,{id:"resolving-permission-errors",children:"Resolving Permission Errors"}),"\n",(0,i.jsxs)(A.p,{children:[(0,i.jsx)(A.code,{children:"EACCES"})," permission errors can occur when packages are installed globally. If this is the case, npm may need to be set up to operate without elevated permissions."]}),"\n",(0,i.jsx)(A.admonition,{type:"note",children:(0,i.jsxs)(A.p,{children:["Using ",(0,i.jsx)(A.code,{children:"sudo"})," with npm is ",(0,i.jsx)(A.strong,{children:"not recommended"})," because it can lead to further complications."]})}),"\n",(0,i.jsxs)(A.p,{children:["This guide offers two options for resolving permission issues. Refer to the ",(0,i.jsx)(A.a,{href:"https://docs.npmjs.com/resolving-eacces-permissions-errors-when-installing-packages-globally",children:"npm docs"})," for full documentation and additional options."]}),"\n",(0,i.jsx)(A.h3,{id:"option-1",children:"Option 1"}),"\n",(0,i.jsx)(A.p,{children:"The best way to avoid permission issues is to reinstall NodeJS and npm using a node version manager."}),"\n",(0,i.jsxs)(A.p,{children:["This guide will document ",(0,i.jsx)(A.a,{href:"https://github.com/nvm-sh/nvm",children:"nvm"})," installation and usage. Refer to the ",(0,i.jsx)(A.a,{href:"https://github.com/nvm-sh/nvm#installation-and-update",children:"nvm docs"})," for full documentation. Refer to the ",(0,i.jsx)(A.a,{href:"https://docs.npmjs.com/downloading-and-installing-node-js-and-npm#using-a-node-version-manager-to-install-nodejs-and-npm",children:"npm docs"})," for additional options and instructions for Windows."]}),"\n",(0,i.jsxs)(A.ol,{children:["\n",(0,i.jsxs)(A.li,{children:["\n",(0,i.jsx)(A.p,{children:"Install nvm."}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-shell",children:"$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash\n"})}),"\n"]}),"\n",(0,i.jsxs)(A.li,{children:["\n",(0,i.jsx)(A.p,{children:"New terminals will now use nvm. To verify, open a new terminal and run the following. If something prints, the installation was successful."}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-shell",children:"$ command -v nvm\n"})}),"\n"]}),"\n",(0,i.jsxs)(A.li,{children:["\n",(0,i.jsx)(A.p,{children:"To download and install the latest LTS release of NodeJS, run:"}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-shell",children:"$ nvm install --lts\n"})}),"\n"]}),"\n",(0,i.jsxs)(A.li,{children:["\n",(0,i.jsx)(A.p,{children:"Set the newly installed NodeJS as the default environment:"}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-shell",children:"$ nvm alias default lts/*\n"})}),"\n"]}),"\n",(0,i.jsxs)(A.li,{children:["\n",(0,i.jsx)(A.p,{children:"New terminals will now use the nvm-controlled NodeJS. To verify:"}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-shell",children:"$ node -v # will print the version installed above\n$ which npm # will print a path somewhere within the ~/.nvm folder\n"})}),"\n"]}),"\n"]}),"\n",(0,i.jsxs)(A.p,{children:["Global packages will now be installed in the ",(0,i.jsx)(A.code,{children:"~/.nvm"})," directory, so permission errors should no longer occur as long as ",(0,i.jsx)(A.code,{children:"npm"})," is used ",(0,i.jsx)(A.em,{children:"without"})," ",(0,i.jsx)(A.code,{children:"sudo"}),"."]}),"\n",(0,i.jsx)(A.h3,{id:"option-2",children:"Option 2"}),"\n",(0,i.jsx)("small",{children:(0,i.jsx)("em",{children:"Does not apply to Windows"})}),"\n",(0,i.jsx)(A.p,{children:"Change the owner of npm's directories to the current user:"}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-shell",children:"$ sudo chown -R $(whoami) /usr/local/{lib/node_modules,bin,share}\n$ sudo chown -R $(whoami) /usr/lib/node_modules\n$ sudo chown -R $(whoami) ~/.npm ~/.npmrc\n"})}),"\n",(0,i.jsxs)(A.p,{children:["Since these global directories are no longer owned by ",(0,i.jsx)(A.code,{children:"root"}),", packages can be installed globally ",(0,i.jsx)(A.em,{children:"without"})," ",(0,i.jsx)(A.code,{children:"sudo"}),"."]}),"\n",(0,i.jsx)(A.h2,{id:"updating-dependencies",children:"Updating Dependencies"}),"\n",(0,i.jsxs)(A.p,{children:["To update an ",(0,i.jsx)(A.a,{href:"https://www.npmjs.com/",children:"npm"})," dependency, run the following, where ",(0,i.jsx)(A.code,{children:"<package-name>"})," is the package to update:"]}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-shell",children:"npm install <package-name>@<version|latest> --save\n"})}),"\n",(0,i.jsxs)(A.p,{children:["For example, to update the ",(0,i.jsx)(A.code,{children:"@ionic/angular"})," package to the release tagged ",(0,i.jsx)(A.code,{children:"latest"}),", run:"]}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-shell",children:"npm install @ionic/angular@latest --save\n"})}),"\n",(0,i.jsxs)(A.p,{children:["It is recommended that packages get updated through the CLI since npm will now read package versions from the ",(0,i.jsx)(A.code,{children:"package-lock.json"})," first."]}),"\n",(0,i.jsx)(A.h2,{id:"code-editors",children:"Code Editors"}),"\n",(0,i.jsx)(A.p,{children:"There are a lot of code editors to choose from. Here are some of our favorites:"}),"\n",(0,i.jsxs)(A.ul,{children:["\n",(0,i.jsxs)(A.li,{children:[(0,i.jsx)(A.a,{href:"https://code.visualstudio.com",children:"Visual Studio Code"}),": a popular and free text editor made by Microsoft"]}),"\n",(0,i.jsxs)(A.li,{children:[(0,i.jsx)(A.a,{href:"https://www.jetbrains.com/webstorm/",children:"WebStorm"}),": a powerful non-free editor by JetBrains"]}),"\n"]}),"\n",(0,i.jsx)(A.h2,{id:"using-a-debugger",children:"Using a Debugger"}),"\n",(0,i.jsxs)(A.p,{children:["The ",(0,i.jsx)(A.code,{children:"debugger"})," keyword can be used to debug an app. When most browsers encounters a ",(0,i.jsx)(A.code,{children:"debugger"}),' statement, running of JavaScript is stopped, and the browser will load its debugger. This can be used to set "breakpoints" in the app.']}),"\n",(0,i.jsx)(A.p,{children:"For example, if a function is not returning the correct value, the debugger can be used to step through the code and inspect variables."}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-javascript",children:"function myBrokenFunction() {\
1n debugger;\n // do other stuff\n}\n"})}),"\n",(0,i.jsx)(A.p,{children:"When an app runs, it will pause at this function. From there, the developer tools can be used to run pieces of JavaScript, line by line, and inspect where exactly the function breaks."}),"\n",(0,i.jsx)(A.h2,{id:"changing-mode",children:"Changing Mode"}),"\n",(0,i.jsxs)(A.p,{children:["By default, when an app is viewed in the browser, Ionic will apply the ",(0,i.jsx)(A.code,{children:"md"})," mode. However, since Ionic components adapt according to their platform, it is helpful to be able to view what the app will look like on iOS. To do this, add ",(0,i.jsx)(A.code,{children:"?ionic:mode=ios"})," to the URL where the app is being served. For example, if the app is served on port ",(0,i.jsx)(A.code,{children:"8100"}),", the url would be: ",(0,i.jsx)(A.code,{children:"http://localhost:8100/?ionic:mode=ios"}),"."]}),"\n",(0,i.jsx)(A.admonition,{type:"note",children:(0,i.jsxs)(A.p,{children:["This will not change which platform the browser detects. The platform is determined by device detection and inspecting the user-agent. To change the platform, the user-agent must be changed. To do this, open up Chrome DevTools with ",(0,i.jsx)("kbd",{children:"Ctrl+Shift+I"}),"(",(0,i.jsx)("kbd",{children:"Cmd+Option+I"})," on Mac), and then toggle device mode on with ",(0,i.jsx)("kbd",{children:"Ctrl+Shift+M"}),"(",(0,i.jsx)("kbd",{children:"Cmd+Option+M"})," on Mac)."]})}),"\n",(0,i.jsx)(A.p,{children:(0,i.jsx)(A.img,{alt:"Chrome DevTools showing the device mode with iPhone X selected.",src:n(98550).A+"",title:"Chrome DevTools Device Mode",width:"1398",height:"264"})}),"\n",(0,i.jsx)(A.p,{children:"Selecting devices from the device dropdown will change the user-agent, as well as the dimensions of the viewport."}),"\n",(0,i.jsx)(A.h2,{id:"using-the-ios-simulator",children:"Using the iOS Simulator"}),"\n",(0,i.jsx)(A.p,{children:"The iOS simulator enables testing and debugging of an app before it reaches an actual device."}),"\n",(0,i.jsxs)(A.p,{children:["Before it can be used, ",(0,i.jsx)(A.a,{href:"https://developer.apple.com/xcode/download/",children:"Xcode"}),", Apple's IDE, must be installed."]}),"\n",(0,i.jsxs)(A.p,{children:["The ",(0,i.jsx)(A.a,{href:"/docs/v8/cli",children:"Ionic CLI"})," can then be used to run the app in the current directory on the simulator:"]}),"\n",(0,i.jsx)(A.pre,{children:(0,i.jsx)(A.code,{className:"language-shell",children:"ionic cordova emulate ios -lc\n"})}),"\n",(0,i.jsxs)(A.p,{children:["Passing in the ",(0,i.jsx)(A.code,{children:"-lc"})," flag will enable livereload and log console output to a terminal."]}),"\n",(0,i.jsx)(A.p,{children:"Xcode can also be used to launch the emulator and debug an app."}),"\n",(0,i.jsxs)(A.p,{children:["Open up Xcode and open ",(0,i.jsx)(A.code,{children:"../path-to-app/platforms/ios/myApp.xcodeproj"}),"."]}),"\n",(0,i.jsx)(A.p,{children:"After the app loads, console output and device logs will be printed inside of Xcode's output window."}),"\n",(0,i.jsx)(A.h2,{id:"using-the-genymotion-android-emulator",children:"Using the Genymotion Android Emulator"}),"\n",(0,i.jsx)(A.p,{children:"While the Android SDK comes with a stock emulator, it can be slow and unresponsive at times."}),"\n",(0,i.jsxs)(A.p,{children:[(0,i.jsx)(A.a,{href:"https://www.genymotion.com",children:"Genymotion"})," is an alternate emulator that is faster, and still allows access to native functionality like GPS and camera."]})]})}function c(e={}){let{wrapper:A}={...(0,s.R)(),...e.components};return A?(0,i.jsx)(A,{...e,children:(0,i.jsx)(a,{...e})}):a(e)}},98550(e,A,n){n.d(A,{A:()=>o});let o="data:image/png;base64,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"},28453(e,A,n){n.d(A,{R:()=>t,x:()=>l});var o=n(96540);let i={},s=o.createContext(i);function t(e){let A=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(A):{...A,...e}},[A,e])}function l(e){let A;return A=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:t(e.components),o.createElement(s.Provider,{value:A},e.children)}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.