diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,5 +1,9 @@
 # ChangeLog for yesod-core
 
+## 1.6.28.0 (unreleased)
+
+* Allow users to control generation of the `resourcesSite :: [ResourceTree String]` value. [#1881](https://github.com/yesodweb/yesod/pull/1881)
+
 ## 1.6.27.1
 
 * Set `base >= 4.11` for less CPP and imports [#1876](https://github.com/yesodweb/yesod/pull/1876)
diff --git a/src/Yesod/Core/Dispatch.hs b/src/Yesod/Core/Dispatch.hs
--- a/src/Yesod/Core/Dispatch.hs
+++ b/src/Yesod/Core/Dispatch.hs
@@ -28,6 +28,7 @@
     , setEqDerived
     , setShowDerived
     , setReadDerived
+    , setCreateResources
       -- *** Helpers
     , defaultGen
     , getGetMaxExpires
diff --git a/src/Yesod/Core/Internal/TH.hs b/src/Yesod/Core/Internal/TH.hs
--- a/src/Yesod/Core/Internal/TH.hs
+++ b/src/Yesod/Core/Internal/TH.hs
@@ -42,6 +42,7 @@
     , setEqDerived
     , setShowDerived
     , setReadDerived
+    , setCreateResources
     )
  where
 
@@ -254,11 +255,16 @@
     dispatchDec    <- mkDispatchInstance site appCxt f res
     parseRoute <- mkParseRouteInstance appCxt site res
     let rname = mkName $ "resources" ++ namestr
-    eres <- lift resS
-    let resourcesDec =
-            [ SigD rname $ ListT `AppT` (ConT ''ResourceTree `AppT` ConT ''String)
-            , FunD rname [Clause [] (NormalB eres) []]
-            ]
+    resourcesDec <-
+        if shouldCreateResources opts
+            then do
+                eres <- lift resS
+                pure
+                    [ SigD rname $ ListT `AppT` (ConT ''ResourceTree `AppT` ConT ''String)
+                    , FunD rname [Clause [] (NormalB eres) []]
+                    ]
+            else do
+                pure []
     let dataDec = concat
             [ [parseRoute]
             , renderRouteDec
diff --git a/src/Yesod/Routes/TH/RenderRoute.hs b/src/Yesod/Routes/TH/RenderRoute.hs
--- a/src/Yesod/Routes/TH/RenderRoute.hs
+++ b/src/Yesod/Routes/TH/RenderRoute.hs
@@ -1,4 +1,5 @@
 {-# LANGUAGE CPP #-}
+{-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE TemplateHaskellQuotes #-}
 {-# LANGUAGE TupleSections #-}
 
@@ -9,12 +10,14 @@
     , mkRouteCons
     , mkRouteConsOpts
     , mkRenderRouteClauses
+    , shouldCreateResources
 
     , RouteOpts
     , defaultOpts
     , setEqDerived
     , setShowDerived
     , setReadDerived
+    , setCreateResources
     ) where
 
 import Yesod.Routes.TH.Types
@@ -29,23 +32,33 @@
 
 -- | General opts data type for generating yesod.
 --
--- Contains options for what instances are derived for the route. Use the setting
--- functions on `defaultOpts` to set specific fields.
+-- Contains options for customizing code generation for the router in
+-- 'mkYesodData', including what type class instances will be derived for
+-- the route datatype and whether or not to create the @resources ::
+-- [ResourceTree String]@ value. Use the setting functions on `defaultOpts`
+-- to set specific fields.
 --
 -- @since 1.6.25.0
 data RouteOpts = MkRouteOpts
     { roDerivedEq   :: Bool
     , roDerivedShow :: Bool
     , roDerivedRead :: Bool
+    , roCreateResources :: Bool
     }
 
 -- | Default options for generating routes.
 --
--- Defaults to all instances derived.
+-- Defaults to all instances derived and to create the @resourcesSite ::
+-- [ResourceTree String]@ term.
 --
 -- @since 1.6.25.0
 defaultOpts :: RouteOpts
-defaultOpts = MkRouteOpts True True True
+defaultOpts = MkRouteOpts
+    { roDerivedEq = True
+    , roDerivedShow = True
+    , roDerivedRead = True
+    , roCreateResources = True
+    }
 
 -- |
 --
@@ -65,12 +78,34 @@
 setReadDerived :: Bool -> RouteOpts -> RouteOpts
 setReadDerived b rdo = rdo { roDerivedRead = b }
 
+-- | Determine whether or not to generate the @resourcesApp@ value.
+--
+-- Disabling this can be useful if you are creating the @routes ::
+-- [ResourceTree String]@ elsewhere in your module, and referring to it
+-- here. The @resourcesApp@ can become very large in large applications,
+-- and duplicating it can result in signifiacntly higher compile times.
+--
+-- @since 1.6.28.0
+setCreateResources :: Bool -> RouteOpts -> RouteOpts
+setCreateResources b rdo = rdo { roCreateResources = b }
+
+-- | Returns whether or not we should create the @resourcesSite ::
+-- [ResourceTree String]@ value during code generation.
+--
+-- @since 1.6.28.0
+shouldCreateResources :: RouteOpts -> Bool
+shouldCreateResources = roCreateResources
+
 -- |
 --
 -- @since 1.6.25.0
 instanceNamesFromOpts :: RouteOpts -> [Name]
-instanceNamesFromOpts (MkRouteOpts eq shw rd) = prependIf eq ''Eq $ prependIf shw ''Show $ prependIf rd ''Read []
+instanceNamesFromOpts MkRouteOpts {..} = prependIf roDerivedEq ''Eq $ prependIf roDerivedShow ''Show $ prependIf roDerivedRead ''Read []
     where prependIf b = if b then (:) else const id
+
+-- |
+--
+-- @since 1.6.28.0
 
 -- | Generate the constructors of a route data type.
 mkRouteCons :: [ResourceTree Type] -> Q ([Con], [Dec])
diff --git a/yesod-core.cabal b/yesod-core.cabal
--- a/yesod-core.cabal
+++ b/yesod-core.cabal
@@ -1,5 +1,5 @@
 name:            yesod-core
-version:         1.6.27.1
+version:         1.6.28.0
 license:         MIT
 license-file:    LICENSE
 author:          Michael Snoyman <michael@snoyman.com>
